在python中如何判断目录是否是windows连接
我正在运行在python中如何判断目录是否是windows连接,python,windows,filesystems,symlink,Python,Windows,Filesystems,Symlink,我正在运行os.walk()在“C:\Users\confusedev\Documents”上,我看到[“我的音乐”、“我的图片”…]作为子目录返回,但它们实际上没有被访问。经过一些研究,我发现它们实际上在Windows中 我的理解是,junction是指向目录的符号链接,在os.walk()期间,默认情况下会忽略该符号链接,但以下测试使我失败 >>> os.path.islink("C:\\Users\\confusedDev\\Documents\\My Pictures"
os.walk()
在“C:\Users\confusedev\Documents”
上,我看到[“我的音乐”、“我的图片”…]
作为子目录返回,但它们实际上没有被访问。经过一些研究,我发现它们实际上在Windows中
我的理解是,junction是指向目录的符号链接,在os.walk()
期间,默认情况下会忽略该符号链接,但以下测试使我失败
>>> os.path.islink("C:\\Users\\confusedDev\\Documents\\My Pictures")
False
嗯。
os.walk()
怎么知道“C:\Users\confusedDev\Documents\My Pictures”是指向“C:\Users\confusedDev\Pictures”的符号链接,需要跳过?我想调用相同的api…现在,我的解决方案逻辑只是假设如果一个目录被os.walk()
跳过,那么它就是一个使用python3.5
的连接,islink
为连接链接返回false。似乎python3.5
本机不支持连接链接,但可以使用ctypes
或外部库添加对连接链接的支持:
使用ntfs的外部模块:
在pywin32中使用win32模块:
直接调用DLL:
这些都是更复杂的解决方案。此外,如果您使用连接链接
,它们将无法在以前版本的windows或其他操作系统上工作
TL;DR为了便于携带,最好使用mklink/D
而不是mklink/J
将连接链接
转换为符号链接
<代码>符号链接
由os.walk
和os.path.islink
识别,我将使用的另一种方法是子流程。只需调用提供有关windows中链接信息的外部windows程序,如果链接存在,则返回0作为返回码,如果不存在或不是链接,则返回其他值:
fsutil reparsepoint query "<PathToTest>"
在Windows 10上,作为普通用户可以正常工作(也可以创建链接),但对于Windows 7,您需要管理员权限。对我来说这不是问题,因为我的应用程序将检查链接以创建一个新的链接,所以它仍然需要Windows7上的管理员权限
你好 有点晚了,但您可以尝试包装os.readlink(),但目录连接除外,然后将其放入可以调用的函数中,如下所示:
def is_junction(path: str) -> bool:
try:
return bool(os.readlink(path))
except OSError:
return False
os。[l]stat
的实现可能重复,内部不一致。对于follow_symlinks
,它将任何重分析点作为链接处理,而不是将其正确地限制为仅符号链接和[某些]连接。此外,在创建统计结果时,它只接受S\u iflink
mode标志的符号链接重分析点,这是islink
检查的内容。它还应该接受连接,但仅当它们实现旧链接时,即当目标是一个“\\?\Volume{…}”装入点时才接受连接,GetVolumeNameForVolumeMountPoint
将成功装入该装入点。@GrzegorzOledzki,他说的是Windows连接链接,而不是符号链接:。在windows中它们不一样。。对于连接链接
,即使在Python3中,islink也返回false。你知道如何在python中检查连接链接吗?感谢上帝,你是唯一一个完全正确的连接链接,没有使用win32库或不可靠的ctypes。非常感谢你。我用dir已经有一段时间了。最后我得到了你体面的解决方案。
def is_junction(path: str) -> bool:
try:
return bool(os.readlink(path))
except OSError:
return False