На поверхности это довольно просто, и я мог реализовать ее сам легко. Просто последовательно назовите dirname (), чтобы повыситься каждый уровень в пути файла и проверить каждого, чтобы видеть, является ли это каталог, мы проверяем на.
Но символьные ссылки бросают все это в хаос. Любой каталог вдоль пути любого, проверяемый файл или каталог мог быть символьной ссылкой и любой символьной ссылкой, мог иметь произвольную цепочку символьных ссылок на другие символьные ссылки. В этой точке мои мозговые плавки и я не уверены, что сделать. Я попытался писать код для обработки этих особых случаев, но он скоро является слишком сложным, и я предполагаю, что делаю его неправильно. Существует ли довольно изящный способ сделать это?
Я использую Python, таким образом, любое упоминание о библиотеке, которая делает это, было бы прохладно. Иначе это - довольно нейтральная в отношении языка проблема.
Используйте os.path.realpath
и os.path.commonprefix
:
os.path.commonprefix(['/the/dir/', os.path.realpath(filename)]) == "/the/dir/"
os.path.realpath
расширит любые симлинки, а также ...
в имени файла. os.path.commonprefix
немного непостоянен - он не проверяет пути, а только префиксы строк, поэтому вы должны убедиться, что ваш каталог заканчивается разделителем каталогов. В противном случае он будет утверждать, что /the/dirtwo/filename
также находится в /the/dir