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


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

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

现在我使用以下内容:

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

这个可以吗?


5964
2018-01-17 10:12


起源

>>> os.path.normcase(os.path.normpath(r"c:\users\aayoubi\desktop")) 'c:\\users\\aayoubi\\desktop' 我找不到会失败的情况。 - aayoubi
我刚刚找到一个例子。 'c:\\ one \ two'和'c:\\ one \ two \'可以指向同一目录,但是这种方法会说它们不同。 - Nikolay Polivanov
两个产出都是一样的: >>> os.path.normcase(os.path.normpath(r"c:\\one\two")) 'c:\\one\\two'  >>> os.path.normcase(os.path.normpath(r"c:\\one\two\\")) 'c:\\one\\two' - aayoubi
嗯,你是对的。谢谢。 - Nikolay Polivanov
您需要能够处理网络路径吗?例如(\\ 127.0.0.1 \ c $ \ test相当于c:\ test) - Shawabawa


答案:


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

对于旧版本的Python,这是一种使用 GetFileInformationByHandle 功能:

see_if_two_files_are_the_same_file


5
2017-10-09 08:46





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

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

3
2018-01-17 12:20



我想技术上可以在两次调用stat之间修改文件。像他在问题中那样比较路径不会有这个问题 - Shawabawa
是的,对于随机文件,这种机会非常小。但我有一堆半自动创建的文件,其中许多都有相同的大小和时间戳。 - Nikolay Polivanov
我认为这种方法可能导致难以发现的错误。例如,当归档程序解压缩大量具有相同时间戳的文件时,就会发生这种情况。如果它们是零字节文件,那么最终会出现大量错误匹配... - David Fraser


真实的用例 os.path.samefile 不是象征性的联系,而是  链接。 os.path.samefile(a, b) 如果返回True a 和 b 都是同一文件的硬链接。他们可能没有相同的路径。


2
2017-07-26 20:53