枚举python3中所有硬链接的快速方法

时间:2019-06-13 23:19:01

标签: python-3.x hardlink

是否有一种快速的方法/功能来枚举文件的所有硬链接?是什么直接给了我所有到给定文件的硬链接的路径?在Windows上,如果有关系的话。

我了解os.stat("foo.txt").st_nlinkos.path.samefile(path1, path2)

使用这些,我可能可以结合一些东西来枚举给定文件的所有硬链接。欢迎您提出实施建议。

1 个答案:

答案 0 :(得分:1)

在Windows上,通过FindFirstFileNameFindNextFileNameFindClose三重奏有助于枚举到任何给定文件的硬链接。幸运的是,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

其中1st2nd3rd都是指向同一文件的硬链接。

(使用Python 3.8和pywin32 v227测试)