C++有没有任何等价于python的os.path.join函数的东西?基本上,我在寻找一个可以将文件路径的两个(或更多)部分结合起来的东西,这样你就不必担心这两个部分是否能完美地结合在一起。如果它在Qt中,那也很酷。基本上,我花了一个小时调试一些代码,其中至少有一部分是因为root + filename必须是root/ + filename,我希望在未来避免这种情况。
os.path.join
root + filename
root/ + filename
5rgfhyps1#
仅作为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
stszievb2#
类似于**@user405725的答案(但不使用boost),并且@ildjarn**在注解中提到,此功能作为std::filesystem的一部分提供。以下代码使用Homebrew GCC 9.2.0_1和--std=c++17标志编译:
--std=c++17
#include <iostream> #include <filesystem> namespace fs = std::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; }
noj0wjuj3#
请查看QDir以了解:
QString path = QDir(dirPath).filePath(fileName);
zzwlnbp84#
至少在Unix / Linux中,用/连接路径的部分总是安全的,即使路径的某些部分已经以/结束,即root/path等价于root//path。在这种情况下,您真正需要的是在/上加入东西,也就是说,我同意其他人的回答,如果boost::filesystem对您可用,它是一个很好的选择,因为它支持多个平台。
/
root/path
root//path
boost::filesystem
zu0ti5jz5#
如果你想用Qt来做这个,你可以使用QFileInfo构造函数:
QFileInfo
QFileInfo fi( QDir("/tmp"), "file" ); QString path = fi.absoluteFilePath();
x6h2sr286#
使用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
e1xvtsh37#
在Qt中,当使用Qt API(QFile,QFileInfo)时,只需在代码中使用/。它在所有平台上都是正确的。如果你必须传递一个非Qt函数的路径,或者想格式化它以显示给用户,请使用QDir:toNativeSeparators(),例如:
QFile
QDir:toNativeSeparators()
QDir::toNativeSeparators( path );
它会用本地的等价物(例如Windows上的\)替换/。另一个方向通过QDir::fromNativeSeparators()完成。
\
QDir::fromNativeSeparators()
ugmeyewa8#
下面是一个非常简单的C++11友好的替代方案,适用于既没有Boost、Qt也没有C++17(取自here)的用户:
std::string pathJoin(const std::string& p1, const std::string& p2) { char sep = '/'; std::string tmp = p1; #ifdef _WIN32 sep = '\\'; #endif // Add separator if it is not included in the first path: if (p1[p1.length()] != sep) { tmp += sep; return tmp + p2; } else { return p1 + p2; } }
8条答案
按热度按时间5rgfhyps1#
仅作为Boost.Filesystem库的一部分。以下是一个示例:
下面是编译和运行的示例(特定于平台):
stszievb2#
类似于**@user405725的答案(但不使用boost),并且@ildjarn**在注解中提到,此功能作为std::filesystem的一部分提供。以下代码使用Homebrew GCC 9.2.0_1和
--std=c++17
标志编译:noj0wjuj3#
请查看QDir以了解:
zzwlnbp84#
至少在Unix / Linux中,用
/
连接路径的部分总是安全的,即使路径的某些部分已经以/
结束,即root/path
等价于root//path
。在这种情况下,您真正需要的是在
/
上加入东西,也就是说,我同意其他人的回答,如果boost::filesystem
对您可用,它是一个很好的选择,因为它支持多个平台。zu0ti5jz5#
如果你想用Qt来做这个,你可以使用
QFileInfo
构造函数:x6h2sr286#
使用C++11和Qt可以做到这一点:
用法:
e1xvtsh37#
在Qt中,当使用Qt API(
QFile
,QFileInfo
)时,只需在代码中使用/
。它在所有平台上都是正确的。如果你必须传递一个非Qt函数的路径,或者想格式化它以显示给用户,请使用QDir:toNativeSeparators()
,例如:它会用本地的等价物(例如Windows上的
\
)替换/
。另一个方向通过QDir::fromNativeSeparators()
完成。ugmeyewa8#
下面是一个非常简单的C++11友好的替代方案,适用于既没有Boost、Qt也没有C++17(取自here)的用户: