WinAPI - 如果文件不存在,则创建.ini文件

WinAPI - Create .ini file if it doesn't exist

本文关键字:文件 创建 ini 不存在 如果 WinAPI      更新时间:2023-10-16

可能的重复项:
C++ 如何从路径创建目录

我正在尝试在应用程序数据文件夹中创建一个.ini文件,以便我可以使用设置。我试了一下,但我不知道如何检查它是否已经存在,如果没有,请创建子目录并.ini文件。

当我收到最后一条错误消息时,它说"系统找不到指定的路径"。

#include <string>
using namespace std;
#include <Windows.h>
#include <Shlwapi.h>
#include <ShlObj.h>
#pragma comment(lib, "shlwapi.lib")
namespace Settings
{
    CIni        Ini;
    bool        Available = false;
    char        Directory[MAX_PATH];
    const char *IniFileName = "Settings.ini";
    void CheckError() {
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError(); 
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lpMsgBuf, 0, NULL
        );
        string msg = (LPTSTR)lpMsgBuf;
        Error(msg); // MessageBox
    }
    void Initialize() {
        // Get AppData directory
        if (SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, 0, Directory) >= 0) {
            string fullpath;
            string subDir = "\MyCompany\MyProgram\1.0\";
            PathAppend(Directory, subDir.c_str());
            fullpath = Directory;
            fullpath += IniFileName;
            // If directory doesn't exist, create it.
            DWORD attrib = GetFileAttributes(Directory);
            if (!(attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY))) {
                if (CreateDirectory(Directory, NULL)) {
                    HANDLE file = CreateFile(
                        fullpath.c_str(), GENERIC_WRITE, 0, 0,
                        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
                    );
                    if (file != INVALID_HANDLE_VALUE) {
                        CloseHandle(file);
                    } else {
                        CheckError();
                        return;
                    }
                } else {
                    CheckError();
                    return;
                }
            }
            Ini.SetPathName(fullpath.c_str());
            Available = true;
        }
    }
}

检查了一下,我给CreateDirectory()的电话返回错误。如何检查文件和目录是否存在,如果不存在,则创建它们?

if (SHCreateDirectoryEx(NULL, Directory, NULL) || 
    GetLastError() == ERROR_ALREADY_EXISTS) 
   {
   HANDLE file = CreateFile(
      fullpath.c_str(), GENERIC_WRITE, 0, 0,
      CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
   if (file != INVALID_HANDLE_VALUE) 
     {
     CloseHandle(file);
     } 
     else if (GetLastError() != ERROR_FILE_EXISTS) 
       {
       CheckError();
       return;
       }
   } 
   else 
   {
   CheckError();
   return;
   }
您需要一次

创建一个级别的子文件夹。

即创建"我的公司",然后

创建"我的程序",然后创建"1.0"。 你可以编写一个函数来做到这一点,类似于VCL的ForceDirectory。

此外,请注意,除非使用管理员权限运行,否则常见应用数据在 Windows7 上不可写。 除非应用程序安装程序创建一个子文件夹并在其上设置适当的安全 ACL 以允许访问。 如果可以,请避免使用用户应用数据文件夹。