创建临时文件:无法写入它

时间:2012-05-16 08:08:56

标签: c++ winapi

每当我在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??

2 个答案:

答案 0 :(得分:6)

GetTempFileName()将始终创建文件:

  

如果uUnique为零,则该函数尝试使用当前系统时间形成唯一文件名。如果该文件已存在,则该数字将增加1,并且函数将测试此文件是否已存在。这将继续,直到找到唯一的文件名; 该函数按该名称创建一个文件并将其关闭。请注意,当uUnique为非零时,该函数不会尝试验证文件名的唯一性。

然后在CREATE_NEW中指定了{p> CreateFile()(正如Mat指出的那样),导致CreateFile()返回INVALID_FILE_HANDLE

  

CREATE_NEW   仅当新文件尚不存在时才创建新文件。   如果指定的文件存在,则函数失败,最后一个错误代码设置为ERROR_FILE_EXISTS(80)。   如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。

答案 1 :(得分:2)

您指定CREATE_NEW作为创建处置。如果文件已经存在,则失败,因此您返回一个无效句柄 - 显然,您无法写入无效句柄。

如果您想要始终重新创建文件,请使用CREATE_ALWAYS

请参阅CreateFile API文档。

相关问题