无法使用createFile API在Windows中创建文件

use*_*021 2 windows file-io winapi

我无法使用CreateFileAPI 在Windows中创建文件,GetLastError返回错误代码80,这意味着文件存在,但实际上文件不存在.

hFile = CreateFile((LPCTSTR) FILEPATH,  // name of the write 
    GENERIC_READ|GENERIC_WRITE,         // open for writing
    0,                                  // do not share
    NULL,                               // default security 
    CREATE_ALWAYS,                      // create new file only 
    FILE_ATTRIBUTE_NORMAL,              // normal file
    NULL);                              // no attr. template
printf("GET LAST ERROR VALUE IS: %d\n", GetLastError());
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dav*_*nan 6

您的错误检查是错误的.文件说:

返回值

如果函数成功,则返回值是指定文件,设备,命名管道或邮件槽的打开句柄.

如果函数失败,则返回值为INVALID_HANDLE_VALUE.要获取扩展错误信息,请致电GetLastError.

换句话说,失败由返回值决定.您不能GetLastError用来确定失败.您必须检查返回值并进行比较INVALID_HANDLE_VALUE.当你这样做时,我预测你会发现返回值不等于INVALID_HANDLE_VALUE.


实际上,即使函数成功,此API也会使用最后一个错误值来传递额外信息.

来自以下文件CREATE_ALWAYS:

如果指定的文件存在且可写,则该函数将覆盖该文件,该函数成功,并将最后一个错误代码设置为ERROR_ALREADY_EXISTS(183).

并从以下文件CREATE_NEW:

仅当新文件尚不存在时才创建新文件.如果指定的文件存在,则函数失败,最后一个错误代码设置为ERROR_FILE_EXISTS(80).

等等.

黄金法则,你必须燃烧到你的记忆中,是错误检查因功能而异,你必须从头到尾阅读文档.


请注意,我对你的(LPCTSTR)演员表示怀疑.那只是在惹麻烦.如果路径类型错误,编译器将自行保存,除非您使用该转换.该演员只是告诉编译器闭嘴.但在这里它知道的更好.该演员表将允许您将ANSI文本传递给广泛的API,反之亦然.你真的应该删除它.