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

时间:2012-01-17 10:12:43

标签: python filesystems

如果他们指向同一个文件,我必须比较两条路径。在Unix中,这可以使用os.path.samefile来完成,但正如文档所述,它在Windows中不可用。 模拟此功能的最佳方法是什么? 它不需要模拟常见情况。就我而言,有以下简化:

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

现在我使用以下内容:

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

这样可以吗?

4 个答案:

答案 0 :(得分:5)

根据issue#5985,os.path.samefile和os.path.sameopenfile现在位于py3k中。我在Python 3.3.0上验证了这一点

对于旧版本的Python,这是一种使用GetFileInformationByHandle函数的方法:

see_if_two_files_are_the_same_file

答案 1 :(得分:3)

os.stat系统调用返回一个元组,其中包含有关每个文件的大量信息 - 包括创建和上次修改时间戳,大小,文件属性。具有相同参数的不同文件的机会非常小。我认为这是非常合理的:

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我知道这是该主题的较晚答案。但是我在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对此进行了测试。