C ++是否与python的函数os.path.join
有任何等价物?基本上,我正在寻找一种结合文件路径的两个(或更多)部分的东西,这样您就不必担心确保两个部分完美地结合在一起。如果它在Qt中,那也很酷。
基本上我花了一个小时调试一些代码,至少部分代码是因为root + filename
必须是root/ + filename
,我希望将来能避免这种情况。
答案 0 :(得分:93)
仅作为Boost.Filesystem库的一部分。这是一个例子:
#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main ()
{
fs::path dir ("/tmp");
fs::path file ("foo.txt");
fs::path full_path = dir / file;
std::cout << full_path << std::endl;
return 0;
}
以下是编译和运行的示例(特定于平台):
$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test
/tmp/foo.txt
答案 1 :(得分:37)
请查看QDir:
QString path = QDir(dirPath).filePath(fileName);
答案 2 :(得分:17)
类似于 @ user405725 的答案(但不使用提升),并且在评论中由 @ildjarn 提及,此功能可作为{{3的一部分提供}}。以下代码使用Microsoft Visual Studio 2015 Community Edition进行编译:
#include <iostream>
#include <filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path dir ("/tmp");
fs::path file ("foo.txt");
fs::path full_path = dir / file;
std::cout << full_path << std::endl;
return 0;
}
答案 3 :(得分:8)
至少在Unix / Linux中,通过/
连接部分路径始终是安全的,即使路径的某些部分已经以/
结尾,即root/path
等效到root//path
。
在这种情况下,您真正需要的是加入/
上的内容。也就是说,我同意其他答案boost::filesystem
是一个很好的选择,因为它可以支持多个平台。
答案 4 :(得分:5)
如果您想使用Qt执行此操作,可以使用QFileInfo
构造函数:
QFileInfo fi( QDir("/tmp"), "file" );
QString path = fi.absoluteFilePath();
答案 5 :(得分:3)
在Qt中,在使用Qt API(/
,QFile
)时,只需在代码中使用QFileInfo
。它将在所有平台上做正确的事情。如果您必须将路径传递给非Qt函数,或者想要将其格式化以便将其显示给用户,请使用QDir:toNativeSeparators()
例如:
QDir::toNativeSeparators( path );
它将替换/
本机等效项(即Windows上的\
)。另一个方向是通过QDir::fromNativeSeparators()
完成的。
答案 6 :(得分:3)
使用C ++ 11和Qt,您可以这样做:
QString join(const QString& v) {
return v;
}
template<typename... Args>
QString join(const QString& first, Args... args) {
return QDir(first).filePath(join(args...));
}
用法:
QString path = join("/tmp", "dir", "file"); // /tmp/dir/file