0

我必须CreateFile()创建一个隐藏文件类型,但它不断返回无效句柄的问题。

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

任何的想法?

4

3 回答 3

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如果你得到一个返回值as可能不会在它开始之前重置最后一个错误,你应该只检查错误CreateFile(),所以如果函数成功,你可能会得到虚假的错误值GetLastError()......

除非您使用模板文件参数,否则最后一个错误 6,ERROR_INVALID_HANDLE是不寻常的,而您不是...CreateFile()

您使用CreateFileWand _T("") 的代码不正确,不会在非 unicode 版本中编译。最好使用CreateFileand _T("") 或CreateFileWand L""。

您的代码不会创建隐藏文件,请参阅 molbdnilo 的答案。

于 2011-05-08T07:33:52.853 回答
3

0不是 的有效参数dwFlagsAndAttributes。要创建隐藏文件,请通过FILE_ATTRIBUTE_HIDDEN.

于 2011-05-08T07:06:08.293 回答
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 将失败。

于 2011-08-17T09:52:56.383 回答