我正在写一个C ++问题。它需要在Windows和Unix OS上运行。
如何在不同的操作系统上获取用户或系统tmp文件夹?
答案 0 :(得分:39)
更新:感谢@RoiDanton,最新答案是std::filesystem::temp_directory_path
(C ++ 17)
尝试boost::filesystem
内部使用的temp_directory_path()
:
ISO / IEC 9945(POSIX):列表TMPDIR
,TMP
,TEMP
中找到的第一个环境变量提供的路径,TEMPDIR
。如果找不到这些,"/tmp"
。
Windows :Windows GetTempPath
API函数报告的路径。
有趣的是,Window的GetTempPath
使用与POSIX版本类似的逻辑:列表TMP
,TEMP
,USERPROFILE
中的第一个环境变量。如果找不到这些,则返回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