Как эмулировать поведение 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:

see_if_two_files_are_the_same_file

Реальный вариант использования 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.

Другие вопросы по тегам