Есть ли 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()
удалит двойной / (или двойной \, в соответствии с 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()
).
Вы можете использовать статические методы 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");