如何在unix和windows中获取系统或用户临时文件夹? 我写的是C++问题。它需要在Windows和Unix操作系统上工作

如何在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环境变量

如何在不同的操作系统上获取用户或系统tmp文件夹?

根据POSIX,使用环境变量

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函数报告的路径

有趣的是,Window使用了与POSIX版本类似的逻辑:列表中的第一个环境变量
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()
            }