В 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);
}
}
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);
}
}
[Надежный] Temp для всего, что доступно вашему приложению (C ++ 17)
#include <filesystem>
// ...
auto temp_path = std::filesystem::temporary_directory_path().wstring();
temporary_directory_path
, скорее всего, вернет короткое имя вместо полного имени.
Вероятно, вы получите наибольшую пользу от первой и последней функций в зависимости от ваших потребностей. Если вы имеете дело с приложениями AppContainer, выберите последнее, предоставленное <filesystem>
. Должен вернуть что-то вроде
C:\Users\user name\AppData\Local\Packages\{APP's GUID}\AC\Temp