我需要一个类似于.NET的方法,可以安全地组合路径部分,而不必担心路径分隔符的特定于平台的问题。
在QT4中是否有这样的类和方法?
类似于以下格式:
QPath::Combine
我需要一个类似于.NET的方法,可以安全地组合路径部分,而不必担心路径分隔符的特定于平台的问题。
在QT4中是否有这样的类和方法?
类似于以下格式:
QPath::Combine
没有任何函数可以直接替代Path.Combine()
,因此您必须自己编写它。
您可以采用较为困难的方式(手动处理所有内容),或者简单地使用QDir::cleanPath()
:
QString pathAppend(const QString& path1, const QString& path2)
{
return QDir::cleanPath(path1 + QDir::separator() + path2);
}
我使用了QDir::separator()
,但正如在Cross-platform way of constructing a FS path with Qt中指出的那样,你实际上并不需要它,只需使用/即可。 QDir::cleanPath()
将删除双重/(或双重\,根据QDir::separator()
),并将.和..解析为适当的值。有关QT PathAppend()
替换的代码,请参见Qt equivalent of PathAppend?。PathAppend()
(请参阅MSDN),但这不是Path.Combine()
的精确替代品,因为Path.Combine()
没有执行清理或规范化(它只是追加字符串,以适当的方式处理目录分隔符,请参见MSDN)。如果需要一个精确的替代品,您可以使用这个:QString pathCombine(const QString& path1, const QString& path2)
{
if (path2.startsWith(QDir::separator()))
return path2;
return trimEnd(path1, QDir::separator())
+ QDir::separator()
+ trim(path2, QDir::separator());
}
如果path2
是一个目录名,这个函数不会添加尾部的目录分隔符(它不执行任何检查,路径甚至可能不存在)。同时请注意,path2
必须是path1
的子路径(不支持相对于path1
更高级的相对路径,如果需要,您必须使用带有 QDir::cleanPath()
的先前版本),而且,如果path2
已经是根路径,则会返回path2
(此实现相当简单,例如,它无法将c:\directory
识别为根路径)。
trim()
和trimEnd()
函数会删除尾部目录分隔符(可以参考如何从Qt中的QString中去除尾随空格?来了解一种通用的实现方法)。确保有一个尾部目录分隔符的算法与如何确保路径中存在尾部目录分隔符?中描述的算法相同(因为这里始终有一个由QDir::separator()
给出的目录分隔符)。您可以使用静态方法QDir::fromNativeSeparators
和QDir::toNativeSeparators
,然后在处理路径时始终使用/
。
Path.Combine("c://test_folder", "filename.txt")
在QT中是否有类似的安全路径组合技术? - Gad D LordQDir
和https://dev59.com/dXRB5IYBdhLWcg3wCjgV。 - Ivo我不知道是否有完全相同的解决方案,但是你可以使用QDir::cd()
函数来接近目标:
QDir path("base_path");
path.cd("subdir");
很遗憾,我认为这只适用于目录,而不是文件。对于文件,您可以使用QDir :: filePath()
:
QDir path("base_path");
QString file_path = path.filePath("file.txt");
cd()
函数并没有真正执行路径操作:只有源目录存在时它才会执行 cd 操作,因此它混合了路径构建和存在性检查(在我看来这很愚蠢)。 - Luc Touraille
cd()
执行存在检查的评论)。 - Andy