我正在尝试将文件写入临时文件夹,但它没有正确执行.当我稍后进入代码调用它时,它引用了正确的位置,但表示它不存在.关于我做错了什么的任何想法?
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();
}
Run Code Online (Sandbox Code Playgroud)
如果我不想使用TEMP文件夹,一切正常.如果我想把它放在我的桌面上,它的效果非常好.任何想法为什么环境变量在创建时无法正常工作,但在尝试创建过程时,它会给出一个引用环境变量指定的正确位置的错误.
正如Retired Ninja指出的那样,如果您选择使用环境变量,则可能需要翻译环境变量.
此外,还有其他特殊文件夹的方法.实际上,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;
Run Code Online (Sandbox Code Playgroud)
对于其他特殊文件夹,您可以选择使用Shell API.
SHGetFolderPath()并且SHGetKnownFolderPath()可以在各种版本的Windows中良好地工作,无论目标文件夹位于何处.并且有大量的文件夹.
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 ]
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
编辑:有一个专门用于创建和使用临时文件的示例.
编辑2:请注意TEMP/ TMP环境变量在各种系统上可能略有不同.但是它们应该是相同的值.查看"备注"部分,GetTempPath()了解路径的确定方式.
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |