是否有一种快速的方法/功能来枚举文件的所有硬链接?是什么直接给了我所有到给定文件的硬链接的路径?在Windows上,如果有关系的话。
我了解os.stat("foo.txt").st_nlink
和os.path.samefile(path1, path2)
。
使用这些,我可能可以结合一些东西来枚举给定文件的所有硬链接。欢迎您提出实施建议。
答案 0 :(得分:1)
在Windows上,通过FindFirstFileName,FindNextFileName和FindClose三重奏有助于枚举到任何给定文件的硬链接。幸运的是,pywin32在一次调用中为我们包装了这些文件:
import win32file
hardlinks = win32file.FindFileNames(r'path\as\string')
幸运的是,FindFileNames()
仅接受字符串输入,并且在返回的每个路径上都保留尾随null(错误报告为here)。我们可以轻松地弥补这一点,并在使用时返回更有用的pathlib.Path
对象:
import os
from pathlib import Path
from typing import Union, List
from win32file import FindFileNames
def enumerate_hardlinks(path: Union[bytes, str, Path]) -> List[Path]:
def strip_null(p):
return p[:-1] if p.endswith('\x00') else p
# Convert possible path representations to a string.
path = os.fsdecode(os.fspath(path))
return [Path(strip_null(n)) for n in FindFileNames(path)]
要验证输出,您还可以使用Windows CMD和PowerShell中的fsutil枚举到文件的所有硬链接:
>fsutil hardlink list C:\Users\name\1st
\Users\name\1st
\Users\name\2nd
\Users\name\3rd
其中1st
,2nd
和3rd
都是指向同一文件的硬链接。
(使用Python 3.8和pywin32 v227测试)