如何在Windows和Python 2.7上模拟os.path.samefile行为?

l5tcr1uw  于 2023-10-15  发布在  Python
关注(0)|答案(4)|浏览(84)

给定两个路径,我必须比较它们是否指向同一个文件。在Unix中,这可以通过os.path.samefile来完成,但正如文档所述,它在Windows中不可用。模拟此函数的最佳方法是什么?它不需要模仿普通情况。在我的例子中,有以下简化:

  • 路径不包含符号链接。
  • 文件在同一个本地磁盘中。

现在我使用以下命令:

def samefile(path1, path2)
    return os.path.normcase(os.path.normpath(path1)) == \
           os.path.normcase(os.path.normpath(path2))

这样行吗?

plicqrtu

plicqrtu1#

根据issue#5985,os.path.samefile和os.path.sameopenfile现在在py3k中。我在Python 3.3.0上验证了这个
对于旧版本的Python,这里有一种使用GetFileInformationByHandle函数的方法:
see_if_two_files_are_the_same_file

ac1kyiln

ac1kyiln2#

stat系统调用返回一个元组,其中包含关于每个文件的大量信息,包括创建和最后修改时间戳、大小、文件属性。不同文件具有相同参数的可能性非常小。我认为这是非常合理的做法:

def samefile(file1, file2):
    return os.stat(file1) == os.stat(file2)
gjmwrych

gjmwrych3#

os.path.samefile的真实的用例不是符号链接,而是 * 硬 * 链接。如果ab都是指向同一文件的硬链接,则os.path.samefile(a, b)返回True。他们可能不会走同一条路。

mrwjdhj3

mrwjdhj34#

我知道这是一个迟来的答案。但是我在Windows上使用python,今天遇到了这个问题,找到了这个线程,发现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。
注意事项:
st_inost_dev并不总是有意义的内容。
在Windows 10,Python 2.7.9上观察:st_ino始终为0。
See older post here

相关问题