我正在编写一个C++问题。它需要在Windows和Unix操作系统上工作。
如何在不同的操作系统中获取用户或系统的临时文件夹?
我正在编写一个C++问题。它需要在Windows和Unix操作系统上工作。
如何在不同的操作系统中获取用户或系统的临时文件夹?
更新:感谢 @RoiDanton,最新的答案是 std::filesystem::temp_directory_path
(C++17)
尝试使用boost::filesystem
的temp_directory_path()
,它内部使用:
ISO/IEC 9945 (POSIX):由列表TMPDIR
、TMP
、TEMP
、TEMPDIR
中找到的第一个环境变量所指定的路径。如果没有找到这些变量,则使用"/tmp"
,或者如果定义了宏__ANDROID__
,则使用"/data/local/tmp"
Windows:由Windows GetTempPath
API函数报告的路径。
有趣的是,Windows 的 GetTempPath
使用与 POSIX 版本类似的逻辑:列表中的第一个环境变量是 TMP
、TEMP
或 USERPROFILE
。如果没有找到这些变量,则返回 Windows 目录。
这些方法主要依赖于环境变量似乎有点不太好。但这就是它们的决定方式。既然它真的很平凡,你可以很容易地使用 cstdlib
的 getenv
函数自己编写代码,特别是如果你想要特定顺序的优先级或不想使用其他库。
按照POSIX标准,使用$TMPDIR
环境变量。
char const *folder = getenv("TMPDIR");
if (folder == 0)
folder = "/tmp";
TMP
适用于 Windows,不是 TMPDIR
。 - T.ToduaQString QDir::tempPath()
,或者在代码中使用它的实现(因为QT是开源的,所以可以查看他们是如何实现的)。TCHAR szPath[MAX_PATH + 1];
DWORD result = GetTempPath(MAX_PATH + 1, szPath);
if (result != ERROR_SUCCESS) {
// check GetLastError()
}
便捷函数:
std::string getEnvVar( std::string const & key )
{
char * val = getenv( key.c_str() );
return val == NULL ? std::string("") : std::string(val);
}
我猜TEMP或其他什么参数可以被传递?当然,这取决于操作系统。getenv是stdlib的一部分,因此应该也是可移植的。
bash a_launcher.sh
其中 a_launcher.sh 就像这样
./a.out /tmp
wstring TempPath;
wchar_t wcharPath[MAX_PATH];
if (GetTempPathW(MAX_PATH, wcharPath))
TempPath = wcharPath;
这些例子都不是非常具体,并没有提供一个工作示例(除了 std::filesystem::temp_directory_path),而是指向了微软的文档,下面是一个使用“GetTempPath()”的工作示例(在 Windows 10 上测试通过):
//temp.cpp
#include <iostream>
#include <windows.h>
int main()
{
TCHAR path_buf[MAX_PATH];
DWORD ret_val = GetTempPath(MAX_PATH, path_buf);
if ( ret_val > MAX_PATH || (ret_val == 0) )
{
std::cout << "GetTempPath failed";
} else {
std::cout << path_buf;
}
}
输出:
C:\>temp.exe
C:\Users\username\AppData\Local\Temp\
tmpfile
或者tmpnam
来获取一个临时文件。 - Kerrek SBGetTempFileName
гҖӮ - Matteo Italiatmpfile
函数不会给你一个文件名;tmpnam
函数会给你一个文件名,但是并不安全(请参阅mkstemp()
,它可以同时给你文件名和文件描述符,并且是安全的)。 - Jonathan Leffler