Есть ли 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");