如何在C++中获取用户的临时文件夹路径?我的程序必须在Windows Vista和XP上运行,并且它们具有不同的临时路径.如何在不失去兼容性的情况下获得它?
Jar*_*Par 22
有没有理由不能使用Win32 GetTempPath API?
此API从W2K开始提供,因此可用于所有列出的目标.
小智 6
GetTempPath函数检索为临时文件指定的目录的路径.此函数取代GetTempDrive函数.
DWORD GetTempPath(
DWORD nBufferLength, // size, in characters, of the buffer
LPTSTR lpBuffer // address of buffer for temp. path
);
Run Code Online (Sandbox Code Playgroud)
参数
nBufferLength
指定由lpBuffer标识的字符串缓冲区的大小(以字符为单位).
lpBuffer
指向字符串缓冲区,该字符串缓冲区接收指定临时文件路径的以null结尾的字符串.
返回值
如果函数成功,则返回值是复制到lpBuffer的字符串的长度(以字符为单位),不包括终止空字符.如果返回值大于nBufferLength,则返回值是保存路径所需的缓冲区大小.如果函数失败,则返回值为零.要获取扩展错误信息,请调用GetLastError.
备注
GetTempPath函数获取临时文件路径,如下所示:
小智 6
从C ++ 17开始,您可以使用跨平台功能:
std::filesystem::temp_directory_path()
https://en.cppreference.com/w/cpp/filesystem/temp_directory_path
在 Windows 10 中,这可能很棘手,因为临时路径的值不仅取决于它的默认设置,还取决于您正在使用的应用程序类型。所以这取决于你具体需要什么。
#include <Windows.h>
#include <Shlobj.h>
#include <Shlobj_core.h>
#include <string_view>
// ...
static void GetUserLocalTempPath(std::wstring& input_parameter) {
static constexpr std::wstring_view temp_label = L"\\Temp\\";
HWND folder_handle = { 0 };
WCHAR temp_path[MAX_PATH];
auto get_folder = SHGetFolderPath(
folder_handle, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_DEFAULT, temp_path
);
if (get_folder == S_OK) {
input_parameter = static_cast<const wchar_t*>(temp_path);
input_parameter.append(temp_label);
CloseHandle(folder_handle);
}
}
Run Code Online (Sandbox Code Playgroud)
GetUserLocalTempPath可能会返回全名而不是短名。
另外,如果正在运行的任何内容都以 SYSTEM 而不是登录用户的身份执行,那么%USERPROFILE%\AppData\Local\Temp它不会返回 ,而是返回类似的内容,C:\Windows\System32\config\systemprofile\AppData\Local\Temp
#include <Windows.h>
// ...
static void GetEnvTempPath(std::wstring& input_parameter) {
wchar_t * env_var_buffer = nullptr;
std::size_t size = 0;
if ( _wdupenv_s(&env_var_buffer, &size, L"TEMP") == 0 &&
env_var_buffer != nullptr) {
input_parameter = static_cast<const wchar_t*>(env_var_buffer);
}
}
Run Code Online (Sandbox Code Playgroud)
#include <filesystem>
// ...
auto temp_path = std::filesystem::temp_directory_path().wstring();
Run Code Online (Sandbox Code Playgroud)
temp_directory_path可能会返回短名称而不是全名。
根据您的需要,您可能会充分利用第一个和最后一个函数。如果您正在处理 AppContainer 应用程序,请选择<filesystem>. 它应该返回类似的东西,
C:\Users\user name\AppData\Local\Packages\{APP's GUID}\AC\Temp
| 归档时间: |
|
| 查看次数: |
32737 次 |
| 最近记录: |