如何从单独的string(安全)build立一个完整的pathstring?

C ++有没有等同于python的函数os.path.join ? 基本上,我正在寻找将文件path的两个(或多个)部分结合在一起的东西,以便您不必担心确保两个部分完美地结合在一起。 如果是Qt,那也会很酷。

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

检查出QDir :

 QString path = QDir(dirPath).filePath(fileName); 

仅作为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; } 

下面是一个编译和运行的例子(特定于平台):

 $ g++ ./test.cpp -o test -lboost_filesystem -lboost_system $ ./test /tmp/foo.txt 

至less在unix / linux中,即使path的某些部分已经以/结尾,即root / path等同于rootpath,通过/连接path的一部分总是安全的。 在这种情况下,你真正需要的是把事情放在/上。 这就是说,我同意其他海报boost :: filesystem是一个不错的select,如果它是可用的,因为它是多平台。

与user405725的答案类似(但不使用boost),并且在注释中由ildjarn提到,此function作为文件系统的一部分提供。 下面的代码使用Microsoft Visual Studio 2015年社区版编译。

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

如果你想用Qt来做到这一点,你可以使用QFileInfo的构造函数:

  QFileInfo fi(QDir("/tmp"),"file"); fi.absoluteFilePath(); //Return QString containing the path 

在Qt中,当使用Qt API(QFile,QFileInfo)时,只需在代码中使用“/”。 它会在所有平台上做正确的事情。 如果你必须传递一个非Qt函数的path,或者想要格式化它以显示给用户,使用QDir:toNativeSeparators()

 QDir::toNativeSeparators( path ) 

它将用本地等价物(即Windows上的“\”)replace“/”。 另一个方向是通过QDir :: fromNativeSeparators()完成的。

用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