我正在尝试在应用程序数据文件夹中创建.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()
的回复是假的。
如何检查文件和目录是否存在,如果不存在则创建它们?
答案 0 :(得分:1)
您需要一次创建一个子文件夹。
即。创建“MyCompany”然后“MyProgram”然后“1.0”..您可以编写一个函数来执行此操作,类似于VCL的ForceDirectories。
此外,请注意,除非使用admin priviledges运行,否则常见的应用程序数据在Windows7上不可写。除非您的应用程序安装程序创建子文件夹并在其上设置适当的安全ACL以允许访问。如果可以,请避免使用用户应用程序数据文件夹。
答案 1 :(得分:1)
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;
}