我有CreateFile()
来创建隐藏文件类型,但问题是它一直返回无效句柄。
file = CreateFileW(_T("hey.txt"),
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
0, 0);
error = GetLastError();
WriteFile(file, buff, sizeof(buff),
&dwRet, NULL);
有什么想法吗?
答案 0 :(得分:4)
最好是你展示了你正在使用的确切代码,包括所有的错误检查,以及你如何做,很重要(特别是在这个问题的情况下)......
对代码进行正确的错误检查应该更像......
file = CreateFile(_T("hey.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
if (file == INVALID_HANDLE_VALUE)
{
const DWORD error = GetLastError();
// Do something!
}
else
{
if (!WriteFile(file, buff, sizeof(buff), &dwRet, NULL))
{
const DWORD error = GetLastError();
// Do something!
}
}
如果获得INVALID_FILE_HANDLE
的返回值,您应该只检查错误,因为CreateFile()
可能无法在启动之前重置上一个错误,因此您可能会从{{1}获得虚假错误值如果函数成功...
GetLastError()
的最后一个错误6 ERROR_INVALID_HANDLE
与CreateFile()
不同,除非您使用的是模板文件参数,而您不是...
使用CreateFileW
和_T(“”)的代码不正确,并且不会在非unicode构建中编译。最好使用CreateFile
和_T(“”)或CreateFileW
和L“”。
您的代码不会创建隐藏文件,请参阅molbdnilo的回答。
答案 1 :(得分:3)
0
不是dwFlagsAndAttributes
的有效参数。要创建隐藏文件,请传递FILE_ATTRIBUTE_HIDDEN
。
答案 2 :(得分:0)
如果“C:\ test.txt”存在且被隐藏,则以下代码失败(h = INVALID_HANDLE_VALUE):
h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
这也失败了(参数6 == FILE_ATTRIBUTES_NORMAL或参数6 == 0似乎是这样):
h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
但这有效:
h = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, 0);
粗略地换句话说: 如果文件已经存在并且被隐藏,那么如果参数6!= FILE_ATTRIBUTE_HIDDEN,那么带有“CREATE_ALWAYS”的CreateFile就会失败。