2012-05-16 220 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文档。