如何在unix和windows中获取系统或用户临时文件夹?

时间:2011-11-10 23:20:51

标签: c++

我正在写一个C ++问题。它需要在Windows和Unix OS上运行。

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

8 个答案:

答案 0 :(得分:39)

更新:感谢@RoiDanton,最新答案是std::filesystem::temp_directory_path(C ++ 17)


尝试boost::filesystem内部使用的temp_directory_path()

  • ISO / IEC 9945(POSIX):列表TMPDIRTMPTEMP中找到的第一个环境变量提供的路径,TEMPDIR。如果找不到这些,"/tmp"

  • Windows :Windows GetTempPath API函数报告的路径。

有趣的是,Window的GetTempPath使用与POSIX版本类似的逻辑:列表TMPTEMPUSERPROFILE中的第一个环境变量。如果找不到这些,则返回Windows目录。

这些方法主要依赖于环境变量的事实看起来有点糟糕。但那就好像是如何确定的。看到它真的是多么平凡,您可以使用cstdlib的{​​{1}}函数轻松推出自己的函数,特别是如果您需要特定的订单优先级/要求或者不想使用其他库。

答案 1 :(得分:7)

根据POSIX,使用$TMPDIR环境变量。

char const *folder = getenv("TMPDIR");
if (folder == 0)
    folder = "/tmp";

答案 2 :(得分:3)

如果您使用QT(Core),您可以尝试QString QDir::tempPath(),或在代码中使用它的实现(QT已打开,因此请检查它们的用途)。

该文档说:在Unix / Linux系统上,这通常是/ tmp;在Windows上,这通常是TEMP或TMP环境变量中的路径。

答案 3 :(得分:0)

便利功能:

std::string getEnvVar( std::string const & key )
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}

我猜TEMP或其他什么东西可以作为参数传递?当然取决于操作系统。 getenv是stdlib的一部分,所以这也应该是可移植的。

答案 4 :(得分:0)

如果您可以访问main()函数代码,最好是通过main()' s ** argv放置必要的文件夹名称,并使用OS依赖的批处理启动器。 例如,对于UNIX

bash a_launcher.sh

其中a_launcher.sh就像

./a.out /tmp

答案 5 :(得分:0)

Windows 上:使用 GetTempPath()检索为临时文件指定的目录路径。

wstring TempPath;
wchar_t wcharPath[MAX_PATH];
if (GetTempPathW(MAX_PATH, wcharPath))
  TempPath = wcharPath;

答案 6 :(得分:0)

这些示例中没有一个是真正具体的,并且没有提供工作示例(除了std :: filesystem :: temp_directory_path之外),而是它们将您引向Microsoft的文档,这是一个使用“ GetTempPath()”的工作示例(在Windows 10上进行了测试) ):

let isLoading = false // alias of isWaitToComplete 

export default function (state = initialState, action) {
  switch (action.type) {
    case types.SCREENS_UPDATE_STARTED: {
      ...
      isLoading = true
      ...    
    }
    case types.SCREENS_UPDATE_SUCCESS: {
      ...
      isLoading = false
      ...
    }
    case types.SCREENS_SELECT: {
      const runAfterPrevActionCompletelyDispatched = () => {

        if (isLoading) {
          // retry
          setTimeout(runAfterPrevActionCompletelyDispatched, 100)
        }

        // state update logic here ...

        return state
          .set('screens', fromJS(screens))
          .set('selectedScreen', fromJS(selectedScreen))
          .set('selectedScreenIds', fromJS(selectedScreenIds))
      }

      return runAfterPrevActionCompletelyDispatched()
    }
  }
}

输出:

//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;
    }
}

答案 7 :(得分:0)

我的评论不足。

根据文档,最大路径为MAX_PATH(260)。如果路径恰好是260,则上面的示例中的代码(总是令人困惑)将失败,因为将返回261。缓冲区的大小可能应该是MAX_PATH + 1。

sed "s/\(.*title=\(.*\)\)/wget -O '\2' '\1'/" a.txt | bash