如何确定文件夹是否是硬链接并获得其真实路径

时间:2017-01-30 17:01:13

标签: python windows python-3.x symlink hardlink

我试图找出文件夹是否真的是另一个文件夹的硬链接,在这种情况下,找出它的真实路径。

我在python中用以下方式做了一个简单的例子(symLink.py):

#python 3.4
import os
dirList = [x[0] for x in os.walk('.')]

print (dirList)

for d in dirList:
    print (os.path.realpath(d), os.path.islink(d))

"""
Given this directories structure:
<dir_path>\Example\
    <dir_path>\Example\symLinks.py
    <dir_path>\Example\hardLinkToF2 #hard link pointing to <dir_path>\Example\FOLDER1\FOLDER2
    <dir_path>\Example\softLinkToF2 #soft link pointing to <dir_path>\Example\FOLDER1\FOLDER2
    <dir_path>\Example\FOLDER1
        <dir_path>\Example\FOLDER1\FOLDER2

The output from executing: C:\Python34\python <dir_path>\Example\symLinks.py is:
['.', '.\\FOLDER1', '.\\FOLDER1\\FOLDER2', '.\\hardLinkToF2']
<dir_path>\Example False
<dir_path>\Example\FOLDER1 False
<dir_path>\Example\FOLDER1\FOLDER2 False
<dir_path>\Example\hardLinkToF2 False
"""

在此示例中,os.path.islink始终为硬链接或软链接返回False。 另一方面,os.path.realpath返回软链接的实际路径,而不是硬链接。

我在Windows 8中使用python 3.4制作了这个例子。 如果我做错了或者有其他方法可以实现它,我不知道。

2 个答案:

答案 0 :(得分:1)

使用重解析点实现Windows上目录的链接。它们可以采用“目录连接”或“符号链接”的形式。在Windows NTFS上无法进行目录的硬链接。

至少从python 3.8开始,os.path.samefile(dir1, dir2)支持符号链接和目录连接,如果两者都解析到相同的目的地,则将返回True

os.path.realpath(dirpath)也将为您提供符号链接和目录连接的真实(完全解析)路径。

如果需要确定两个目录中的哪一个是重新解析点,则可以利用os.lstat(),因为os.path.islink()仅支持符号链接。

import os
import stat

def is_reparse_point(dirpath):
    return os.lstat(dirpath).st_file_attributes & stat.FILE_ATTRIBUTE_REPARSE_POINT

在可能对测试有价值的地方,这是Windows CMD Shell中可用的一些有用实用程序。

询问重解析点数据:

>fsutil reparsepoint query <path to directory>

创建“符号链接”和“目录连接”种类的重新解析点*:

>mklink /d <symbolic link name> <path to target directory>
>mklink /j <junction name>      <path to target directory>

您可以在Microsoft的文档中详细了解difference between hard links and junctionssymbolic linksreparse points

*请注意,创建符号链接通常需要管理员权限。

答案 1 :(得分:0)

不要太苛刻,但我花了1分钟谷歌搜索并得到了所有的答案。暗示提示。

要判断它们是否是硬链接,您必须扫描所有文件,然后比较它们的os.stat结果,看它们是否指向相同的inode。例如:

https://gist.github.com/simonw/229186

对于Windows上python中的符号链接,它可能比较棘手......但幸运的是,这已经得到了解答:

Having trouble implementing a readlink() function

(根据评论中的@ShadowRanger),确保您没有使用联结而不是符号链接,因为它们可能无法正确报告。 - ShadowRanger

https://bugs.python.org/issue29250