如何从单独的字符串(安全地)构建完整路径字符串?
C++ 是否有与 python 的 os.path.join 函数等效的函数?基本上,我正在寻找结合文件路径的两个(或更多)部分的东西,这样您就不必担心确保这两个部分完美地组合在一起。如果是在 Qt 中,那就太酷了。
基本上我花了一个小时调试一些代码,至少部分是因为 root + filename
必须是 root/ + filename
,我希望避免这种情况未来。
Does C++ have any equivalent to python's function os.path.join
? Basically, I'm looking for something that combines two (or more) parts of a file path so that you don't have to worry about making sure the two parts fit together perfectly. If it's in Qt, that would be cool too.
Basically I spent an hour debugging some code and at least part of it was because root + filename
had to be root/ + filename
, and I'm looking to avoid that in the future.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
仅作为
boost::filesystem
图书馆。这是一个例子:这是一个编译和运行的例子(特定于平台):
Only as part of
boost::filesystem
library. Here is an example:Here is an example of compiling and running (platform specific):
与此答案类似(但不使用
boost
),此功能作为std::filesystem
。以下代码使用 Homebrew GCC9.2.0_1
并使用标志--std=c++17
进行编译:Similar to this answer (but not using
boost
), this functionality is available as part ofstd::filesystem
. The following code compiles using Homebrew GCC9.2.0_1
and using the flag--std=c++17
:查看 QDir :
Check out QDir for that:
至少在 Unix / Linux 中,通过
/
连接路径的各个部分总是安全的,即使路径的某些部分已经以/
结尾,即root /path
相当于root//path
。在这种情况下,您真正需要的只是加入
/
上的内容。也就是说,我同意其他答案,即如果您可以使用boost::filesystem
,它是一个不错的选择,因为它支持多个平台。At least in Unix / Linux, it's always safe to join parts of a path by
/
, even if some parts of the path already end in/
, i.e.root/path
is equivalent toroot//path
.In this case, all you really need is to join things on
/
. That said, I agree with other answers thatboost::filesystem
is a good choice if it is available to you because it supports multiple platforms.如果您想使用 Qt 执行此操作,可以使用
QFileInfo
构造函数:If you want to do this with Qt, you can use
QFileInfo
constructor:使用 C++11 和 Qt,您可以执行以下操作:
用法:
With C++11 and Qt you can do this:
Usage:
在Qt中,使用Qt API时只需在代码中使用
/
(QFile
,QFileInfo
)。它将在所有平台上做正确的事情。如果您必须将路径传递给非 Qt 函数,或者想要对其进行格式化以将其显示给用户,请使用QDir:toNativeSeparators()
例如:它将替换
/ 由本机等效项(即 Windows 上的
\
)。另一个方向是通过 QDir::fromNativeSeparators() 完成的。In Qt, just use
/
in code when using Qt API (QFile
,QFileInfo
). It will do the right thing on all platforms. If you have to pass a path to a non-Qt function, or want to format it for displaying it to the user, useQDir:toNativeSeparators()
e.g.:It will replace
/
by the native equivalent (i.e.\
on Windows). The other direction is done viaQDir::fromNativeSeparators()
.对于既没有 Boost、Qt 也没有 C++17 的人来说,这是一个非常简单的 C++11 友好替代方案(摘自 此处)。
Here is a very simple C++11 friendly alternative for the people who have neither Boost, Qt nor C++17 (taken from here).