Russian Qt Forum
Ноябрь 22, 2024, 22:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Опредение того, является ли каталог подкаталогом другого  (Прочитано 3540 раз)
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« : Ноябрь 17, 2021, 06:47 »

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

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

Спасибо.
« Последнее редактирование: Ноябрь 17, 2021, 07:35 от AkonResumed » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Ноябрь 17, 2021, 18:46 »

Может будет достаточно получить QDir::absolutePath обоих каталогов. И посмотреть результат QString::startsWith
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #2 : Ноябрь 17, 2021, 21:05 »

Да, при условии что оба каталога существуют. Только использовать canonicalPath(), т.к. она резолвит симлинки.

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

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

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

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Ноябрь 17, 2021, 22:01 »

Может глянуть https://doc.qt.io/qt-5/qurl.html#isParentOf ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 18, 2021, 06:03 »

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

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

Для того же файла. Помогло QStorageInfo::displayName
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #5 : Ноябрь 18, 2021, 07:02 »

Да! Я бегло смотрел на QUrl (поскольку знал, что в .NET-овской Url есть такой функционал) ... и просмотрел! Возможно, это хорошее решение. Но как она с симлинками (нужно резолвить)?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.