Нет никакой функции, которую можно использовать в качестве прямой замены для 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()
).