【问题标题】:How to write to temporary folder如何写入临时文件夹
【发布时间】:2017-06-19 15:05:42
【问题描述】:

我正在尝试将文件写入临时文件夹,但没有正确执行。当我稍后在代码中调用它时,它引用了正确的位置,但说它不存在。关于我做错了什么的任何想法?

        ofstream fout("%TEMP%\\test.bat"); 
        fout << "cd C:\\Users\\jrowler\\Documents" << endl;
        //Some more fout commands to write to bat
        fout.close();
        wchar_t cmdline[] = L"cmd.exe /C %TEMP%\\test.bat";

if (!CreateProcess(NULL, cmdline, NULL, NULL, false, CREATE_UNICODE_ENVIRONMENT,
        (LPVOID)env.c_str(), NULL, &si, &pi))
    {
        std::cout << GetLastError();
        abort();
    }

如果我不尝试使用 TEMP 文件夹,一切正常。如果我想把它放在我的桌面上,它工作得很好。任何想法为什么环境变量在创建时无法正常工作,但是在尝试创建进程时,它给了我一个错误,它引用了环境变量指定的正确位置。

【问题讨论】:

标签: c++ winapi temp


【解决方案1】:

正如 Retired Ninja 指出的那样,如果您选择使用环境变量,您可能需要 translate the environment variable。

此外,特殊文件夹还有其他方法。其实temp文件夹有一个专门的功能——GetTempPath()。

DWORD const bufferSize = ::GetTempPath(0u, nullptr) + 1u; // get the necessary buffer size
ASSERT(bufferSize);

wchar_t* buffer = new wchar_t[bufferSize];
std::memset(buffer, 0x00, bufferSize);
VERIFY(::GetTempPath(bufferSize, &buffer[0u]));
// [ perform various logic ]
delete[] buffer;

对于其他特殊文件夹,您可以选择使用 Shell API。

SHGetFolderPath() 和SHGetKnownFolderPath() 可以在各种版本的 Windows 中很好地工作,无论目标文件夹位于何处。还有一个tremendous number of folders。

wchar_t folder[MAX_PATH+1];
int const folderId = ... // <-- defined in Shlobj.h

HRESULT const hr = ::SHGetFolderPath(nullptr, folderId, nullptr, SHGFP_TYPE_CURRENT, folder);
if (S_OK != hr)
{
    TRACE("ERROR: Unable to get folder path.");
    return false;
}

// [ perform various logic ]
wchar_t* folder = nullptr;
KNOWNFOLDERID const folderId = ... // <-- defined in KnownFolder.h
HRESULT const hr = ::SHGetKnownFolderPath(folderId, 0u, nullptr, &folder);
if (S_OK != hr)
{
    TRACE("ERROR: Unable to get folder path.");
    return false;
}

// [ perform various logic ]
::CoTaskMemFree(folder);

编辑:有一个专门针对creating and using a temp file 的示例。

EDIT2:注意TEMP/TMP environment variables may be slightly different on various systems。但是它们应该是相同的值。查看GetTempPath() 的“备注”部分,了解路径是如何确定的。

【讨论】:

  • 哦,WinAPI,你真丑。
  • @GillBates:你会如何改进它?不允许作弊。您的改进版本需要 C 接口。
  • 由于您使用的是 C++,因此确实没有理由进行手动内存管理或手动清零缓冲区。只需使用std::vector&lt;wchar_t&gt; buffer(bufferSize); 即可免费获得所有内容(包括潜在的异常安全)。
  • @IInspectable :-) 我希望至少有一条与手动内存管理有关的评论。
  • 请注意,SHGetFolderPath() 和 SHGetKnownFolderPath() 没有为 %TEMP% 文件夹定义文件夹 ID。没有必要这样做,因为 GetTempPath() 存在。
猜你喜欢
  • 2013-12-06
  • 2012-10-27
  • 2021-12-08
  • 2012-12-22
  • 1970-01-01
  • 2010-11-10
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多