2

C++ ネイティブ WinAPI で一時ファイルを作成するたびに、返される HANDLE は常に INVALID_FILE_HANDLE ですが、一時ファイルは正しく作成されていますか?

私は何か間違ったことをしていますか?

GetLastError() を使用すると、出力は次のようになります。

「ファイルが存在します」

以下のコードでは、一時ファイルを正常に作成できますが、CreateFile 関数は常に INVALID_FILE_HANDLE を返し、ファイル ハンドルにテキストを書き込むことができません。

GetTempPath(dirLen, dir);
GetTempFileName(dir, fName, 0, tName);
HANDLE file = CreateFile(tName, GENERIC_WRITE, 0, NULL, CREATE_NEW,
                         FILE_ATTRIBUTE_TEMPORARY, NULL);
if (file == INVALID_HANDLE_VALUE) {
   outputLastError(); // Outputs: "The file exists"
}

if (FAILED(WriteFile(file, (LPTSTR)toWrite.c_str(), strLen, 0, NULL))) {
   cout << (_T("Failed to write string to file \r\n"));
   outputLastError();
   res = false;
}

// WriteFile doesn't fail but the temporary file is empty when I open it?
4

2 に答える 2

6

GetTempFileName()常にファイルを作成します。

uUnique がゼロの場合、関数は現在のシステム時刻を使用して一意のファイル名を作成しようとします。ファイルが既に存在する場合、番号は 1 ずつ増加し、関数はこのファイルが既に存在するかどうかをテストします。これは、一意のファイル名が見つかるまで続きます。関数はその名前でファイルを作成し、それを閉じます。uUnique がゼロ以外の場合、関数はファイル名の一意性を検証しようとしないことに注意してください。

CREATE_NEW次に、で指定され(すでにMatCreateFile()で指摘されているように)、次を返します:CreateFile()INVALID_FILE_HANDLE

CREATE_NEW 新しいファイルが存在しない場合にのみ、新しいファイルを作成します。指定されたファイルが存在する場合、関数は失敗し、最後のエラー コードは ERROR_FILE_EXISTS (80) に設定されます。指定されたファイルが存在せず、書き込み可能な場所への有効なパスである場合、新しいファイルが作成されます。

于 2012-05-16T08:17:09.200 に答える
2

CREATE_NEW作成処分として指定しています。ファイルが既に存在する場合、これは失敗するため、無効なハンドルが返されます。明らかに、無効なハンドルに書き込むことはできません。

常にファイルを再作成する場合は、CREATE_ALWAYS.

CreateFile API ドキュメントを参照してください。

于 2012-05-16T08:15:01.197 に答える