我无法使用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_VALUE
从CreateFile
处理回来,只调用GetLastError
。
其次,最后一个错误代码可以是最后一个错误代码 – 也就是说,最近的调用可能是正确的,但之前失败的东西:再次来自文档
“如果函数没有记录来设置最后一个错误代码,那么这个函数返回的值就是最近设置的最后一个错误代码;一些函数在成功时设置最后一个错误代码为0,不。”