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)
使用python3.5,islink对于 返回 false junction links。它似乎python3.5本身并不支持联结链接,但可以使用ctypes外部库添加对联结链接的支持:
使用 ntfs 的外部模块:https ://github.com/Juntalis/ntfslink-python/tree/master/ntfslink
在pywin32中使用win32模块:http://docs.activestate.com/activepython/2.5/pywin32/win32file__CreateSymbolicLink_meth.html
直接调用dll:/sf/answers/80029351/
这些是更复杂的解决方案。此外,如果您使用junction links,它们将无法在以前版本的 Windows 或其他操作系统上运行。
TL;DR为了使其可移植,最好将您的转换junction links为symbolic linksusingmklink /D而不是mklink /J. symbolic links被os.walk和认可os.path.islink。