我无法使用CreateFile
API 在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());
我究竟做错了什么?
您的错误检查是错误的.文件说:
返回值
如果函数成功,则返回值是指定文件,设备,命名管道或邮件槽的打开句柄.
如果函数失败,则返回值为
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,反之亦然.你真的应该删除它.