Как определить, является ли файл потомком данного каталога?

На первый взгляд это довольно просто, и я мог бы легко реализовать его. Просто последовательно вызовите dirname (), чтобы перейти на каждый уровень по пути файла и проверить каждый из них, чтобы узнать, является ли это каталог, который мы проверяем.

Но символические ссылки бросают все в хаос. Любая директория по пути проверяемого файла или каталога может быть символической ссылкой, и любая символическая ссылка может иметь произвольную цепочку символических ссылок на другие символические ссылки. В этот момент мой мозг тает, и я не уверен, что делать. Я попытался написать код для обработки этих особых случаев, но вскоре он становится слишком сложным, и я полагаю, что я делаю это неправильно. Есть ли разумно элегантный способ сделать это?

Я использую Python, поэтому любое упоминание библиотеки, которая делает это, будет круто. В противном случае это довольно проблемная проблема с языком.

2 Solutions collect form web for “Как определить, является ли файл потомком данного каталога?”

Используйте os.path.realpath и os.path.commonprefix :

 os.path.commonprefix(['/the/dir/', os.path.realpath(filename)]) == "/the/dir/" 

os.path.realpath будет расширять любые символические os.path.realpath , а также .. в имени файла. os.path.commonprefix немного непостоянно – на самом деле он не проверяет пути, просто строковые префиксы, поэтому вы должны убедиться, что ваш каталог завершен в разделителе каталогов. Если вы этого не сделаете, он будет требовать /the/dirtwo/filename также в /the/dir

Python 3.5 имеет полезную функцию os.path.commonpath :

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

Поэтому, чтобы проверить, является ли файл потомком каталога, вы можете сделать это:

 os.path.commonpath(["/the/dir", os.path.realpath(filename)]) == "/the/dir" 

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

  • os.path.isdir () возвращает False, даже если папка существует
  • Использование os.walk для перехода на папки в Python
  • Используйте fnmatch.filter для фильтрации файлов более чем одним возможным расширением файла
  • можно определить, сколько строк существует в файле без каждой итерации в строке?
  • Почему ReplaceFile не работает с ERROR_SHARING_VIOLATION?
  • Найти размер и свободное пространство файловой системы, содержащей данный файл
  • Обнаружение скрытых файлов кросс-платформенной
  • Как проверить, является ли каталог вспомогательной директорией другого каталога
  • Python - лучший язык программирования в мире.