我试图找出文件夹是否真的是另一个文件夹的硬链接,在这种情况下,找出它的真实路径。
我在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制作了这个例子。 如果我做错了或者有其他方法可以实现它,我不知道。
答案 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 junctions,symbolic links和reparse points。
*请注意,创建符号链接通常需要管理员权限。
答案 1 :(得分:0)
不要太苛刻,但我花了1分钟谷歌搜索并得到了所有的答案。暗示提示。
要判断它们是否是硬链接,您必须扫描所有文件,然后比较它们的os.stat
结果,看它们是否指向相同的inode。例如:
https://gist.github.com/simonw/229186
对于Windows上python中的符号链接,它可能比较棘手......但幸运的是,这已经得到了解答:
Having trouble implementing a readlink() function
(根据评论中的@ShadowRanger),确保您没有使用联结而不是符号链接,因为它们可能无法正确报告。 - ShadowRanger