Как эмулировать поведение os.path.samefile в Windows и Python 2.7?
Учитывая два пути, я должен сравнить, указывают ли они на один и тот же файл или нет. В Unix это можно сделать с помощью os.path.samefile
, но, как указано в документации, он не доступен в Windows. Как лучше всего эмулировать эту функцию? Не нужно подражать общему делу. В моем случае есть следующие упрощения:
- Пути не содержат символических ссылок.
- Файлы находятся на одном локальном диске.
Теперь я использую следующее:
def samefile(path1, path2)
return os.path.normcase(os.path.normpath(path1)) == \
os.path.normcase(os.path.normpath(path2))
Это нормально?
3 ответа
В соответствии с проблемой № 5985 os.path.samefile и os.path.sameopenfile теперь находятся в py3k. Я проверял это на Python 3.3.0
Для более старых версий Python есть способ, который использует функцию GetFileInformationByHandle:
Реальный вариант использования os.path.samefile
это не символические ссылки, а жесткие ссылки. os.path.samefile(a, b)
возвращает True, если a
а также b
обе жесткие ссылки на один и тот же файл. Они могут не иметь одинаковый путь.
Системный вызов os.stat возвращает кортеж с большим количеством информации о каждом файле, включая метки времени создания и последнего изменения, размер, атрибуты файла. Шансы на разные файлы с одинаковыми параметрами очень малы. Я думаю, что это очень разумно сделать:
def samefile(file1, file2):
return os.stat(file1) == os.stat(file2)
Я знаю, что это поздний ответ в этой теме. Но я использую python в Windows, и сегодня столкнулся с этой проблемой, нашел этот поток и обнаружил, чтоos.path.samefile
у меня не работает.
Итак, чтобы ответить на OP, now to emulate os.path.samefile
, вот как я его подражаю:
# because some versions of python do not have os.path.samefile
# particularly, Windows. :(
#
def os_path_samefile(pathA, pathB):
statA = os.stat(pathA) if os.path.isfile(pathA) else None
if not statA:
return False
statB = os.stat(pathB) if os.path.isfile(pathB) else None
if not statB:
return False
return (statA.st_dev == statB.st_dev) and (statA.st_ino == statB.st_ino)
Это не настолько плотно, насколько это возможно, потому что мне было больше интересно понять, что я делаю.
Я тестировал это в Windows-10, используя python 2.7.15.