如何在unix和windows中获取系统或用户临时文件夹? 我写的是C++问题。它需要在Windows和Unix操作系统上工作
如何在不同的操作系统上获取用户或系统tmp文件夹?根据POSIX,使用环境变量如何在unix和windows中获取系统或用户临时文件夹? 我写的是C++问题。它需要在Windows和Unix操作系统上工作,c++,C++,如何在不同的操作系统上获取用户或系统tmp文件夹?根据POSIX,使用环境变量 char const *folder = getenv("TMPDIR"); if (folder == 0) folder = "/tmp"; 如果您使用QT(Core),您可以尝试qstringqdir::tempPath(),或者在代码中使用它的实现(QT是开放的,所以请检查它们是如何实现的) 文档说:在Unix/Linux系统上,这通常是/tmp;在Windows上,这通常是TEMP或TMP环境变量
char const *folder = getenv("TMPDIR");
if (folder == 0)
folder = "/tmp";
如果您使用QT(Core),您可以尝试qstringqdir::tempPath()
,或者在代码中使用它的实现(QT是开放的,所以请检查它们是如何实现的)
文档说:在Unix/Linux系统上,这通常是/tmp;在Windows上,这通常是TEMP或TMP环境变量中的路径。便捷功能:
std::string getEnvVar( std::string const & key )
{
char * val = getenv( key.c_str() );
return val == NULL ? std::string("") : std::string(val);
}
我想TEMP或其他什么可以作为参数传递?当然,这取决于操作系统。getenv是stdlib的一部分,因此它也应该是可移植的。如果您可以访问main()函数代码,最好是通过main()的**argv输入必要的文件夹名称,并使用依赖于操作系统的批处理启动程序。 例如,对于UNIX
bash a_launcher.sh
其中一个_launcher.sh类似于
./a.out /tmp
更新:谢谢@RoiDanton,最新的答案是(C++17)
Try的内部使用:
- ISO/IEC 9945(POSIX):在列表
,TMPDIR
,TMP
,TEMP
,TEMP
中找到的第一个环境变量提供的路径。如果找不到它们,TEMPDIR
,或者,如果定义了宏“/tmp”
,则,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“/data/local/tm
- Windows:Windows API函数报告的路径
TMP
,TEMP
,USERPROFILE
。如果没有找到这些文件,它将返回Windows目录
这些方法主要依赖于环境变量这一事实似乎有点令人恶心。但这似乎是如何决定的。考虑到它是多么的平凡,您可以使用
cstdlib
的getenv
函数轻松推出自己的功能,特别是如果您想要特定的订单优先级/要求或不想使用其他库的话。在Windows上:使用GetTempPath()检索为临时文件指定的目录路径
wstring TempPath;
wchar_t wcharPath[MAX_PATH];
if (GetTempPathW(MAX_PATH, wcharPath))
TempPath = wcharPath;
这些示例中没有一个是真正具体的,并且提供了一个工作示例(除了std::filesystem::temp_directory_path),而是指的是microsoft的文档,下面是一个使用“GetTempPath()”的工作示例(在windows 10上测试):
我没有足够的观点来评论 根据文档,最大路径为最大路径(260)。如果路径恰好是260,则上面示例中的代码(als plougy)将失败,因为将返回261。缓冲区大小可能应该是MAX_PATH+1
TCHAR szPath[MAX_PATH + 1];
DWORD result = GetTempPath(MAX_PATH + 1, szPath);
if (result != ERROR_SUCCESS) {
// check GetLastError()
}
不要写更多的问题,我们已经有足够的问题了。写一次解决方案。:-)您需要实际的临时文件夹,还是只需要一个临时文件?C++没有文件系统的概念,所以没有“文件夹”,但是可以使用<代码> TMPFrase<代码>或<代码> TMPNAM>代码>获取临时文件。在Windows上,等效函数是.<代码> tMPfile < /Co>函数不给您命名;
tmpnam
函数为您提供了一个名称,但不安全(请参阅mkstemp()
,它为您提供了一个名称和一个文件描述符,并且是安全的)。不过,使用环境变量有各种各样的缺陷。它们可能在某些提升特权的情况下不可用,或者可能被对手恶意更改(或疏忽)…是的,存在安全问题-但据我所知,没有一种标准的替代方案更广泛可用。您可以(可能应该)在临时目录中创建一个安全的子目录(特别是如果值为/tmp
)来保存文件。请注意,POSIX要求如果路径名“命名符号链接,mkdir(2)
将失败并将errno设置为[EEXIST]”。Linux说,mkdir(2)
在路径名已经存在(不一定是目录)时生成EEXIST。这包括路径名是符号链接,悬空或不悬挂。因此,创建目录是安全的。<代码> TMP < /COM> Windows,而不是<代码> TMPDRR <代码>这是最好的多平台答案,它应该被接受。此外,用C++ 14/C++ 17,它是C++标准的一部分:
C:\>temp.exe
C:\Users\username\AppData\Local\Temp\
TCHAR szPath[MAX_PATH + 1];
DWORD result = GetTempPath(MAX_PATH + 1, szPath);
if (result != ERROR_SUCCESS) {
// check GetLastError()
}