如何从单独的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