2012-05-16 399 views
2

每當我在C++ Native 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?? 

回答

6

GetTempFileName()總是會創建文件:

如果uUnique爲零,該函數嘗試使用當前系統時間,形成了獨特的文件名。如果該文件已經存在,則數字將增加1,並且函數將測試該文件是否已經存在。這一直持續到找到唯一的文件名爲止; 該函數按該名稱創建一個文件並關閉它。請注意,當uUnique不爲零時,函數不會嘗試驗證文件名的唯一性。

CREATE_NEW然後在CreateFile()規定(如已經指出的Mat)造成CreateFile()返回INVALID_FILE_HANDLE

CREATE_NEW 創建一個新的文件,只有當它不存在。 如果指定的文件存在,則該函數失敗,並且最後的錯誤代碼被設置爲ERROR_FILE_EXISTS(80)。 如果指定的文件不存在並且是可寫位置的有效路徑,則會創建一個新文件。

2

您正在指定CREATE_NEW作爲創建處置。這失敗如果文件已經存在,所以你找回一個無效的句柄 - 顯然,你不能寫入一個無效的句柄。

如果您想要始終重新創建該文件,請使用CREATE_ALWAYS

查看CreateFile API文檔。