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

На первый взгляд это довольно просто, и я мог бы легко реализовать его. Просто последовательно вызовите 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 всегда не имеет завершающей косой черты.

Interesting Posts

Python – преобразовать строку datetime UTC в локальное время

json.dump переименовать объект перед дампом

Как перезагрузить модуль python, импортированный с помощью `from module import *`

Python Получить значение словаря с помощью списка ключей

Установили MySQLdb, работают за пределами virtualenv, но внутри его не существует. Как разрешить?

numpy 2d array max / argmax

Как / где Python ищет модули?

Матрица от Python до MATLAB

Многопроцессорность Python непрерывно порождает процессы pythonw.exe без какой-либо реальной работы

Покрытие рекурсивной функции хвостовой рекурсивной в python

Несколько операторов if под одним кодом с несколькими условиями

Как определить, находится ли текущее время в указанном диапазоне с использованием модуля даты и времени Python?

Как найти все упорядоченные пары элементов в массиве целых чисел, сумма которых лежит в заданном диапазоне значений

Google App Engine: Webtest, имитирующий вход в систему пользователя и администратора

Хотелось бы использовать PubNub для отправки обновлений в реальном времени в веб-браузер пользователя

Python - лучший язык программирования в мире.