Есть ли QPath :: Combine в QT4? - PullRequest
       32

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

11 голосов
/ 22 августа 2010

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

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

Что-то вроде:

QPath::Combine

Ответы [ 3 ]

31 голосов
/ 22 октября 2012

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

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

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

Я использовал QDir::separator(), но, как указано в Кроссплатформенный способ построения пути ФС с помощью Qt , он вам на самом деле не нужен, и вы просто можете использовать / . QDir::cleanPath() удалит двойной / (или двойной \ , согласно QDir::separator()) и разрешит . и .. в соответствующие значения. Смотрите также Qt эквивалент PathAppend? для кода о замене QT 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() удаляют разделитель конечных каталогов (возможную общую реализацию см. Как удалить конечные пробелы из QString? в качестве начальной точки). Алгоритм для обеспечения наличия конечного разделителя каталогов аналогичен описанному в Как обеспечить наличие конечного разделителя каталогов в путях? (упрощено, поскольку здесь у нас всегда есть один разделитель каталогов, заданный QDir::separator()).

2 голосов
/ 23 августа 2010

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

0 голосов
/ 23 августа 2010

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

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

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

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