Есть ли Qpath::Combine в QT4?

Мне нужен аналогичный метод .NET для безопасного объединения частей пути, не беспокоясь о специфике платформы разделителя пути.

есть ли такой класс и метод в QT4?

что-то типа:

QPath::Combine

3 ответов


нет никакой функции, которая может быть использована в качестве прямой замены для Path.Combine() поэтому вы должны написать его самостоятельно.

вы можете сделать это на своей шкуре (все самостоятельно) или просто использовать QDir::cleanPath():

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

я QDir::separator() но как указано в кросс-платформенный Способ построения пути FS с Qt вы действительно не нужно, и вы просто можете использовать /. QDir::cleanPath() удалит double / (или двойной \, по данным QDir::separator()) и . и .. соответствующие значения. См. также Qt эквивалент PathAppend? для кода о QT PathAppend() замена.

как сказано, имитирует PathAppend() собственная функция (см. в MSDN), но это не точная замена of 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() функции Удалить разделитель конечных каталогов (для возможной, универсальной, реализации см. Как удалить конечные пробелы из QString? в качестве отправной точки). алгоритм для обеспечения трейлинг-сепаратор каталог же описана в как убедиться, что в путях есть разделитель конечных каталогов? (упрощено, потому что здесь у нас всегда есть один разделитель каталогов, заданный QDir::separator()).


вы можете использовать статические методы QDir::fromNativeSeparators и QDir::toNativeSeparators и затем использовать / везде при манипулировании путем.


Я не знаю ничего подобного, но вы можете приблизиться, используя QDir::cd():

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

к сожалению, я думаю, что работает только для каталогов, а не файлов. Для файлов, вы можете использовать QDir::filePath():

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