WinAPI - 如果文件不存在,则创建.ini文件
WinAPI - Create .ini file if it doesn't exist
可能的重复项:
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 以允许访问。 如果可以,请避免使用用户应用数据文件夹。
相关文章:
- 终端不会为C++文件创建.exe文件吗
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 文件创建并不总是成功
- 如何使用 QFile、c++ 从文件创建整数数组
- 您可以使用 makefile 从 .o 对象文件创建 C++ 文件吗?
- 从函数中的dat文件创建一个2维数组
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何从现有的生成文件创建 CMake 文件?
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 从文本文件创建 2D 字符串矢量
- ofStream: - 尽管文件创建了,但文本文件上没有输出
- 从语言文件创建JSON对象
- 将文本文件创建到节点.js的插件C++