Я работал над файловым менеджером GTK + 3 в Python и столкнулся с той же необходимостью при циклическом просмотре файлов.
Компьютер, на котором я работал, имеет разделы Linux и OS X.Когда приложение менеджера файлов (работающее в корневом разделе Linux) попытается проиндексировать файлы в разделе OS X, оно быстро встретит абсолютную символическую ссылку из "/ media / mac-hd / Руководства пользователя и информация" в "/Библиотека / Документация / Руководства пользователя и информация. Локализовано "и подавиться.Проблема заключалась в том, что файловый менеджер искал абсолютную цель этой ссылки в собственной файловой системе, где она не существует, вместо раздела OS X, смонтированного в / media / mac-hd.Итак, мне нужен был способ определить, что файл находится в другой точке монтирования, и добавить эту точку монтирования к абсолютной цели ссылки.
Я начал с отредактированного решения в Fred Foo ответ.Похоже, это помогло решить конкретную ошибку, которую я пытался обойти.Когда я позвоню find_mount_point('/media/mac-hd/User Guides And Information')
, он вернет /media/mac-hd
.Отлично, подумал я.
Я заметил комментарий небезопасный ниже ответа о том, как заставить его работать с символическими ссылками, а также заметил, что он был прав насчет / var / run:
Чтобы ваш код работал с символическими ссылками, например, / var / run -> ../run, замените os.path.abspath()
на os.path.realpath()
или find_mount_point()
return "/".
Когда я попытался заменить os.path.abspath()
на os.path.realpath()
, я получил бы правильное возвращаемое значение /run
для /var/run
.Однако я также заметил, что больше не получу желаемое значение при вызове find_mount_point('/media/mac-hd/User Guides And Information')
, потому что теперь он возвращает /
.
Ниже приведено решение, которое я в итоге использовал.Возможно, это можно упростить:
def find_mount_point(path):
if not os.path.islink(path):
path = os.path.abspath(path)
elif os.path.islink(path) and os.path.lexists(os.readlink(path)):
path = os.path.realpath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
if os.path.islink(path) and os.path.lexists(os.readlink(path)):
path = os.path.realpath(path)
return path