Windows上的符号链接

6

我正在尝试检查Windows上的路径是否是符号链接,硬链接还是连接点。我该怎么做?os.path.islink()不起作用,它总是返回False。我通过以下方法创建符号链接:

mklink /d linkPath targetDir
mklink /h linkPath targetDir    
mklink /j linkPath targetDir

我使用了命令行,因为os.link和os.symlink仅在Unix系统上可用。

也许有一些命令行工具可以做到这一点? 谢谢

3个回答

2

os.path.islink()文档字符串中写道:

Test for symbolic link.
On WindowsNT/95 and OS/2 always returns false

在Windows中,文件和文件夹的链接以.lnk结尾,因此您可以创建一个函数添加这个扩展名,并使用os.path.isfile()os.path.isfolder()进行检查,例如:

mylink = lambda path: os.path.isfile(path + '.lnk') or  os.path.isdir(path + '.lnk')

我认为这不正确。至少因为我还需要一个链接到文件夹的路径。而且扩展名并不能保证路径是符号链接还是实际路径。 - Eugene
谢谢,但这并不能保证路径是符号链接。我想检查所有路径。 - Eugene
这个答案为什么会得到3个赞,我真的不理解。扩展名与某物是否被视为链接完全没有关系。此外,.lnk文件只是Windows 98“好”旧时代的剩余物,当时Windows不支持任何类似UNIX / Linux长期拥有的符号链接的东西。 - antred
@antred 我理解你的批评...不幸的是,我想不出更好的答案。你有更好的想法吗?为什么你认为这个答案没有回答 OP 的问题? - Saullo G. P. Castro
1
@SaulloCastro:因为快捷方式不是符号链接! - Mayra Delgado

1

这适用于在Windows 8.1上使用NTFS文件系统的Python 3.3。

islink()对于符号链接(如使用mklink创建的)返回True,对于普通文件返回False。


0

摘自https://eklausmeier.wordpress.com/2015/10/27/working-with-windows-junctions-in-python/
(另见:实现readlink()函数时遇到问题

from ctypes import WinDLL, WinError
from ctypes.wintypes import DWORD, LPCWSTR

kernel32 = WinDLL('kernel32')

GetFileAttributesW = kernel32.GetFileAttributesW
GetFileAttributesW.restype = DWORD
GetFileAttributesW.argtypes = (LPCWSTR,) #lpFileName In

INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
FILE_ATTRIBUTE_REPARSE_POINT = 0x00400

def islink(path):
    result = GetFileAttributesW(path)
    if result == INVALID_FILE_ATTRIBUTES:
        raise WinError()
    return bool(result & FILE_ATTRIBUTE_REPARSE_POINT)

if __name__ == '__main__':
    path = "C:\\Programme" # "C:\\Program Files" on a German Windows.
    b = islink(path)
    print path, 'is link:', b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接