【问题标题】:Creating temporary file: can't write to it创建临时文件:无法写入
【发布时间】:2012-05-16 08:08:56
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    GetTempFileName() 将始终创建文件:

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

    CREATE_NEW 然后在CreateFile() 中指定(正如Mat 已经指出的那样)导致CreateFile() 返回INVALID_FILE_HANDLE

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

    【讨论】:

      【解决方案2】:

      您将CREATE_NEW 指定为创建处置。如果文件已经存在,这失败,所以你会得到一个无效的句柄 - 很明显,你不能写入一个无效的句柄。

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

      请参阅CreateFile API 文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 2022-07-10
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        相关资源
        最近更新 更多