在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