aba*_*ert 20
根本问题是你使用的版本太旧了.如果你想坚持2.x,你将无法利用2010年初之后添加的新功能.
其中一个功能是处理NTFS符号链接.在3.2中加入该功能在2010年底(见3.2,3.1,以及2.7源的信息.)
之前Python没有处理NTFS符号链接的原因是直到2009年底都没有这样的东西.(IIRC,支持包含在6.0内核中,但用户空间支持需要Vista/2008上的服务包;只有7/2008R2和新来与它内置的.另外,你需要一个新的,足以MSVCRT能够访问用户空间支持,Python有没有升级到次要版本中新的Visual Studio版本的明确政策.)
代码未被移植回2.x的原因是,永远不会有2.8,而像2.7.3(或2.7.4)这样的错误修复版本不会获得新功能,只会修复错误.
这已被报告为问题13143,并且预期的修复是更改2.7文档以阐明islink始终False在Windows上返回.
所以,如果你想阅读Windows下NTFS符号链接,要么升级到Python 3.2+,或者你必须使用win32api,ctypes等自己做.
或者,正如Martijn Pieters建议的那样,不要自己动手,而是使用类似的第三方库jaraco.windows和/或借用他们的代码.
或者,如果您真的想要,请从3.2源代码中借用代码并围绕它构建一个C扩展模块.如果从跟踪下来ntpath到os到nt(实际上是posixmodule.c),我相信它的胆量都在win32_xstat_impl和win32_xstat_impl_w.
这是我最终用来确定文件或目录是否是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
Run Code Online (Sandbox Code Playgroud)
编辑:根据Zitrax和Annan的建议修改代码
对于目录:
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):
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4591 次 |
| 最近记录: |