14

我需要一种类似于 .NET 的方法来安全地组合路径部分,而不必担心路径分隔符的平台细节。

QT4中有这样的类和方法吗?

就像是:

QPath::Combine
4

3 回答 3

35

没有任何函数可以直接替代,Path.Combine()所以你必须自己编写。

您可能会以艰难的方式(自己处理所有事情)或简单地使用QDir::cleanPath()

QString pathAppend(const QString& path1, const QString& path2)
{
    return QDir::cleanPath(path1 + QDir::separator() + path2);
}

我使用过,但正如在使用 Qt 构建 FS 路径的跨平台方式中QDir::separator()指出的那样,您并不真正需要它,您只需使用. 将删除 double (或 double ,根据)并将解析和到适当的值。另请参阅Qt 等效的 PathAppend?有关 QT替换的代码。/QDir::cleanPath()/\QDir::separator()...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的子路径,如果是根则返回(此实现非常幼稚,例如它不检测为根路径)。path1path1QDir::cleanPath()path2path2 c:\directory

trim() and trimEnd() functions remove trailing directory separator (for a possible, generic, implementation see How do I remove trailing whitespace from a QString? as starting point). Algorithm to ensure there is a trailing directory separator is same one described in How to ensure there is trailing directory separator in paths? (simplified because here we always have one directory separator given by QDir::separator()).

于 2012-10-22T15:17:48.530 回答
2

您可以使用静态方法QDir::fromNativeSeparatorsQDir::toNativeSeparators然后/在操作路径时在任何地方使用。

于 2010-08-23T07:47:50.213 回答
2

我不知道有什么完全一样的,但你可以通过使用来接近QDir::cd()

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

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

QDir path("base_path");
QString file_path = path.filePath("file.txt");
于 2010-08-23T18:29:26.517 回答