如何写入临时文件夹
How to write to temporary folder
我正在尝试将文件写入临时文件夹,但未正确执行。当我稍后进入代码调用它时,它引用了正确的位置,但说它不存在。关于我做错了什么有什么想法吗?
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()
and SHGetKnownFolderPath()
work well across various versions of windows, wherever the target folder may be located. And there are a 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
环境变量在各种系统上可能略有不同。但是它们应该是相同的值。查看GetTempPath()
的'remarks'部分,了解路径是如何确定的。
我正在尝试将文件写入临时文件夹,但未正确执行。当我稍后进入代码调用它时,它引用了正确的位置,但说它不存在。关于我做错了什么有什么想法吗?
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()
and SHGetKnownFolderPath()
work well across various versions of windows, wherever the target folder may be located. And there are a 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
环境变量在各种系统上可能略有不同。但是它们应该是相同的值。查看GetTempPath()
的'remarks'部分,了解路径是如何确定的。