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

我无法使用CreateFile API在窗口中创build文件, 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()); 

我究竟做错了什么?

你的错误检查是错误的。 该文件说:

返回值

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

如果函数失败,返回值是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,反之亦然。 你真的应该删除它。

GetLastError会导致麻烦。 请注意文档说

“如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获得扩展的错误信息,请调用GetLastError。

所以,首先,如果你得到INVALID_HANDLE_VALUECreateFile处理回来,只调用GetLastError

其次,最后一个错误代码可以是最后一个错误代码 – 也就是说,最近的调用可能是正确的,但之前失败的东西:再次来自文档

“如果函数没有记录来设置最后一个错误代码,那么这个函数返回的值就是最近设置的最后一个错误代码;一些函数在成功时设置最后一个错误代码为0,不。”