在QT4中是否有QPath ::Combine函数?

15

我需要一个类似于.NET的方法,可以安全地组合路径部分,而不必担心路径分隔符的特定于平台的问题。

在QT4中是否有这样的类和方法?

类似于以下格式:

QPath::Combine

请修改已接受的答案(参见关于cd()执行存在检查的评论)。 - Andy
3个回答

36

没有任何函数可以直接替代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()给出的目录分隔符)。

2

您可以使用静态方法QDir::fromNativeSeparatorsQDir::toNativeSeparators,然后在处理路径时始终使用/


注:该段内容是关于IT技术的路径操作,建议在代码编写中使用上述方法来处理路径,以保证正确性。

这可能会起到作用,但是Path.Combine还有一个技巧,它可以确保在组合时您没有忘记尾部路径分隔符。Path.Combine("c://test_folder", "filename.txt")在QT中是否有类似的安全路径组合技术? - Gad D Lord
请查看QDir和https://dev59.com/dXRB5IYBdhLWcg3wCjgV。 - Ivo

2

我不知道是否有完全相同的解决方案,但是你可以使用QDir::cd()函数来接近目标:

QDir path("base_path");
path.cd("subdir");

很遗憾,我认为这只适用于目录,而不是文件。对于文件,您可以使用QDir :: filePath()

QDir path("base_path");
QString file_path = path.filePath("file.txt");

8
请注意,cd() 函数并没有真正执行路径操作:只有源目录存在时它才会执行 cd 操作,因此它混合了路径构建和存在性检查(在我看来这很愚蠢)。 - Luc Touraille
1
@LucTouraille 真是太傻了!这让我的单元测试变得复杂了。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接