如何从单独的字符串(安全)构建完整路径字符串?

时间:2011-06-09 18:50:53

标签: c++ qt filepath

C ++是否与python的函数os.path.join有任何等价物?基本上,我正在寻找一种结合文件路径的两个(或更多)部分的东西,这样您就不必担心确保两个部分完美地结合在一起。如果它在Qt中,那也很酷。

基本上我花了一个小时调试一些代码,至少部分代码是因为root + filename必须是root/ + filename,我希望将来能避免这种情况。

7 个答案:

答案 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