为什么CreateFile返回无效句柄?

时间:2011-05-08 07:00:04

标签: c++ winapi file-management

我有CreateFile()来创建隐藏文件类型,但问题是它一直返回无效句柄。

file = CreateFileW(_T("hey.txt"),
                   GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                   0, 0);
error = GetLastError();
WriteFile(file, buff, sizeof(buff),
          &dwRet, NULL);

有什么想法吗?

3 个答案:

答案 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_HANDLECreateFile()不同,除非您使用的是模板文件参数,而您不是...

使用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就会失败。