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開始前に最後のエラーをリセットし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);

つまり、大まかに言い換えると、ファイルが既に存在し、非表示になっている場合、「CREATE_ALWAYS」を指定した CreateFile は、引数 6 != FILE_ATTRIBUTE_HIDDEN の場合に失敗します。

于 2011-08-17T09:52:56.383 に答える