c++ - 如何写入临时文件夹

标签 c++ winapi temp

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

        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 文件夹,一切正常。如果我想把它放在我的桌面上,它工作得很好。关于为什么环境变量在创建时不能正常工作的任何想法,但在尝试创建进程时,它给我一个错误,它引用了环境变量指定的正确位置。

最佳答案

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

此外,对于特殊文件夹还有其他的方法。事实上,临时文件夹有一个专门的功能——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()的“备注”部分查看路径是如何确定的。

关于c++ - 如何写入临时文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003987/

相关文章:

c++ - C++ 中的 MVC 和相互依赖的类

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 以预先指定的顺序打乱数组变量,而不使用 "size of input array"的额外内存

winapi - 以编程方式刷新 IconCache.db

c++ - 当我按下 ALT 时,WINAPI 应用程序关闭,为什么?

c - fwprintf 将回车符放在换行符之前

c++ - G++ -D 选项添加数字 1

sql - 根据临时列加入

MySQL - 从表的 id 字段中没有对应项的数字列表中选择