在Windows 7与Python 2.7我怎么能检测一个路径是一个符号链接? 这不起作用os.path.islink()
它说,它返回false虚假或不支持,我提供的路径,绝对是一个符号链接,所以我猜想它不支持Windows? 我能做什么?
Answer 1:
问题的根源是,你正在使用太旧版本的Python。 如果你想坚持到2.x中,你将不能够采取的2010年初之后添加新功能。
这些功能之一是处理NTFS符号链接。 在3.2中加入该功能在2010年底(见3.2 , 3.1 ,以及2.7源的信息。)
Python的原因没有处理NTFS符号链接在此之前是没有这样的事,直到2009年年底(IIRC,支持被列入6.0内核中,但用户空间支持需要/ 2008在Vista服务包;只有7 / 2008R2和新来与它内置的。另外,你需要一个新的,足以MSVCRT能够访问用户空间支持,Python有没有升级到次要版本中新的Visual Studio版本的明确政策。)
代码并不移植回2.X的原因是那永远不会有一个2.8和bug修复版本2.7.3一样(或2.7.4)没有得到新的功能,只有错误修复。
这已被报告为问题13143 ,和预期的修复方法是将2.7文档澄清islink
总是返回False
的Windows。
所以,如果你想阅读Windows下NTFS符号链接,要么升级到Python 3.2+,或者你必须使用win32api
, ctypes
,等自己做。
或者,正如马亭Pieters的建议,而不是自己动手,使用第三方库像jaraco.windows
,做它和/或借用他们的代码 。
或者,如果你真的想,借由3.2源代码,并围绕它建立一个C扩展模块。 如果从跟踪下来ntpath
到os
到nt
(实际上是posixmodule.c
),我相信它的胆量是win32_xstat_impl
和win32_xstat_impl_w
。
Answer 2:
这是我结束了使用,以确定是否一个文件或目录是Windows 7的链接:
def isLink(path):
if os.path.exists(path):
if os.path.isdir(path):
FILE_ATTRIBUTE_REPARSE_POINT = 0x0400
attributes = ctypes.windll.kernel32.GetFileAttributesW(unicode(path))
return (attributes & FILE_ATTRIBUTE_REPARSE_POINT) > 0
else:
command = ['dir', path]
try:
with open(os.devnull, 'w') as NULL_FILE:
o0 = check_output(command, stderr=NULL_FILE, shell=True)
except CalledProcessError as e:
print e.output
return False
o1 = [s.strip() for s in o0.split('\n')]
if len(o1) < 6:
return False
else:
return 'SYMLINK' in o1[5]
else:
return False
编辑:修改后的代码按Zitrax和安南的建议
Answer 3:
对于目录:
import os, ctypes
def IsSymlink(path):
FILE_ATTRIBUTE_REPARSE_POINT = 0x0400
return os.path.isdir(path) and (ctypes.windll.kernel32.GetFileAttributesW(unicode(path)) & FILE_ATTRIBUTE_REPARSE_POINT):
资源
Answer 4:
刚开始使用if file[-4:len(file)] != ".lnk":
对我的作品
Answer 5:
您也可以使用pywin32模块: GetFileAttributes
是可用win32api
子模块和FILE_ATTRIBUTE_REPARSE_POINT
中win32con
模块。 例如,为了测试给出的路径是一个符号链接到一个目录,代码变为:
import os
import win32api
import win32con
def is_directory_symlink(path):
return bool(os.path.isdir(path)
and (win32api.GetFileAttributes(path) &
win32con.FILE_ATTRIBUTE_REPARSE_POINT))
如果使用Python 2和路径可以包含非ASCII字符, GetFileAttributes
需要Unicode字符串。 然而,简单地使用unicode(path)
通常会失败:你应该测试,如果path
是一个str
,如果是这样,使用它的decode
方法。