如何判断一个目录是否是python中的windows连接

wat*_*HUN 5 python windows filesystems symlink

我正在运行os.walk()"C:\Users\confusedDev\Documents"我看到["My Music", "My Pictures"...]返回为子目录,但它们实际上并未被访问。经过一番研究,我发现它们实际上是Windows 中的连接点

我的理解是 junction 是一个指向目录的符号链接,在 期间默认会被忽略os.walk(),但以下测试让我失败了

>>> os.path.islink("C:\\Users\\confusedDev\\Documents\\My Pictures")
False
Run Code Online (Sandbox Code Playgroud)

嗯...怎么os.walk()知道“C:\Users\confusedDev\Documents\My Pictures”是“C:\Users\confusedDev\Pictures”的符号链接并且需要跳过?我想调用相同的 api...目前,我的解决方法逻辑只是假设如果目录被 跳过os.walk(),那么它是一个结点

小智 10

有点晚了,但是您可以将 os.readlink() 包装在 try 和 except 目录连接中,然后将其放入您可以调用的函数中,如下所示:

def is_junction(path: str) -> bool:
    try:
        return bool(os.readlink(path))
    except OSError:
        return False
Run Code Online (Sandbox Code Playgroud)


alp*_*989 1

使用python3.5,islink对于 返回 false junction links。它似乎python3.5本身并不支持联结链接,但可以使用ctypes外部库添加对联结链接的支持:

  1. 使用 ntfs 的外部模块:https ://github.com/Juntalis/ntfslink-python/tree/master/ntfslink

  2. 在pywin32中使用win32模块:http://docs.activestate.com/activepython/2.5/pywin32/win32file__CreateSymbolicLink_meth.html

  3. 直接调用dll:/sf/answers/80029351/

这些是更复杂的解决方案。此外,如果您使用junction links,它们将无法在以前版本的 Windows 或其他操作系统上运行。

TL;DR为了使其可移植,最好将您的转换junction linkssymbolic linksusingmklink /D而不是mklink /J. symbolic linksos.walk和认可os.path.islink