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