Russian Qt Forum

Qt => Общие вопросы => Тема начата: AkonResumed от Ноябрь 17, 2021, 06:47



Название: Опредение того, является ли каталог подкаталогом другого
Отправлено: AkonResumed от Ноябрь 17, 2021, 06:47
Друзья, заданы два каталога. Это могут быть абсолютные пути, относительные, с симлинками, .. что угодно. Пути локальные. Нужно установить, не является ли один подкаталогом другого (любого уровня).

Qt 5.15. Собственно, в QDir, QQFileInfo я не вижу нужной функции. Неужели мне cdUp()-ить от одного и сравнивать со вторым и наоборот (ну, или там в canonicalPath() подстроки искать)? std::file_system - как там?

Спасибо.


Название: Re: Опредение того, является ли каталог подкаталогом другого
Отправлено: __Heaven__ от Ноябрь 17, 2021, 18:46
Может будет достаточно получить QDir::absolutePath обоих каталогов. И посмотреть результат QString::startsWith


Название: Re: Опредение того, является ли каталог подкаталогом другого
Отправлено: AkonResumed от Ноябрь 17, 2021, 21:05
Да, при условии что оба каталога существуют. Только использовать canonicalPath(), т.к. она резолвит симлинки.

Вообще, если обобщить на случай, когда каталог может не существовать (а это сплошь и рядом, например, юзер задает выходной каталог консольной тулзы), то это далеко нетривиальная задача (если делать на Qt), как может показаться на первый взгляд.

Эти QDir, QQFileInfo и т.п. "относительно ленивы". В том смысле, что если директория/файл не существует, то ф-ии типа absolutePath() не будут работать (возвращают пустые строки).

Собственно, ядро проблемы - для произвольного пути (возможно, пока несуществующего) получить canonicalPath(). А дальше так, как вы указали. Поэтому, если есть каталог "/a/b/c//d/..///./e", то нужно самому сделать то, что делает canonicalPath(). Только это будет чисто строковая обработка. Альтернативно (много проще), временно создать этот каталог и заюзать QFileInfo::canonicalPath, но это как-то топорно. Как-то так мыслю.


Название: Re: Опредение того, является ли каталог подкаталогом другого
Отправлено: qate от Ноябрь 17, 2021, 22:01
Может глянуть https://doc.qt.io/qt-5/qurl.html#isParentOf ?


Название: Re: Опредение того, является ли каталог подкаталогом другого
Отправлено: Igors от Ноябрь 18, 2021, 06:03
Да, при условии что оба каталога существуют. Только использовать canonicalPath(), т.к. она резолвит симлинки.
У меня так не вышло (OSX), ни canonicalPath ни absolutePath "полного имени" не дают (или не гарантируют). Напр

/Volumes/Macintosh HD/...
/Users/igor/...

Для того же файла. Помогло QStorageInfo::displayName


Название: Re: Опредение того, является ли каталог подкаталогом другого
Отправлено: AkonResumed от Ноябрь 18, 2021, 07:02
Может глянуть https://doc.qt.io/qt-5/qurl.html#isParentOf ?
Да! Я бегло смотрел на QUrl (поскольку знал, что в .NET-овской Url есть такой функционал) ... и просмотрел! Возможно, это хорошее решение. Но как она с симлинками (нужно резолвить)?