在Windows中获取用户临时文件夹路径

19 c++ windows directory path

如何在C++中获取用户的临时文件夹路径?我的程序必须在Windows Vista和XP上运行,并且它们具有不同的临时路径.如何在不失去兼容性的情况下获得它?

Jar*_*Par 22

有没有理由不能使用Win32 GetTempPath API?

此API从W2K开始提供,因此可用于所有列出的目标.

  • `GetTempPath()` 的存在时间比 W2K 还要长。它存在于Win95中。 (2认同)

小智 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函数获取临时文件路径,如下所示:

  1. TMP环境变量指定的路径.
  2. 如果未定义TMP,则由TEMP环境变量指定的路径.
  3. 当前目录,如果未定义TMP和TEMP.

  • 我真的很感激信息和链接.链接的问题是它们会随着时间而腐烂. (5认同)
  • 您应该链接到MSDN文档,而不是复制和apsting内容 (4认同)

小智 6

从C ++ 17开始,您可以使用跨平台功能: std::filesystem::temp_directory_path()

https://en.cppreference.com/w/cpp/filesystem/temp_directory_path

  • `std::filesystem::temp_directory_path().wstring()` 非常有用! (2认同)

kay*_*eck 6

在 Windows 10 中,这可能很棘手,因为临时路径的值不仅取决于它的默认设置,还取决于您正在使用的应用程序类型。所以这取决于你具体需要什么。

[公共区域] 用户本地应用数据中的 TEMP

#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

无论 TEMP 环境变量是什么,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)

[强大] 温度适用于您的应用程序可以访问的任何内容 (C++17)

#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