在win32中读取符号链接/结合点目标(通过Python)
任务和背景:
要在win32平台上创建、读取和删除指向目录的链接(目前只针对目录)。
我在Python代码中采用的步骤是:
a. 尝试创建真正的符号链接,如果系统支持的话(通过mklink命令)。
b. 如果不支持,就退而求其次,创建连接点,如果系统支持的话(通过linkd命令)。
读取和删除的过程也是类似的。
问题:
创建和删除符号链接和连接点都很简单,但我不知道怎么读取目标,也就是指向的目录。
进展:
a. 对于连接点,我可以使用'linkd'命令,并且用一种不太优雅的方式解析输出,以获取目标目录。
b. 对于符号链接,似乎没有这样的解决方案。
c. 我看到在Python 3.1.1版本中对win32符号链接有原生支持,但我现在使用的是2.7.1版本,无法升级。
d. 在pywin32模块中有创建符号链接的方法,但我没有找到读取它的方法。
附注:我对Python还很陌生,所以如果有其他简单的方法可以实现这个功能,请告诉我。
[1] [http://bugs.python.org/issue1578269][1]
3 个回答
我也遇到过Win32file库不工作的情况。不过,如果你有Junction这个工具的话,你可以使用这个(只需要把Junction的路径改成你自己的就行):
def getOriginalPath(junctionPath):
# TCPROGS - system env. variable
cmd = subprocess.Popen('%TCPROGS%\Junction\junction.exe '+junctionPath, shell=True, stdout=subprocess.PIPE)
for line in cmd.stdout:
if line.find('Substitute Name:') >= 0:
start = line.find(':')
return line[start+1:].strip()
break
如果你不想依赖Junction的话,你也可以解析一下DIR /A:L
这个命令的输出。
你可以在这里找到一个使用 win32file模块 来读取符号链接的代码片段,还有一些帖子讲解如何使用 ctypes 模块来创建符号链接。我还在这里写了一个 Python C扩展,实现了在Windows上创建连接点、符号链接和硬链接,不过我得提醒你,这个代码需要大改。因为我在写的时候并没有深入了解Python C扩展,所以没有正确地设置一些必要的东西,比如 Py_XREF 等等。
在那个代码库里,还有一个使用 ctypes 模块来读取、写入和检查连接点的实现。
这主要是关于 重解析点 的内容。
这篇 Code Project 的文章应该能提供你需要的信息。你需要把里面的内容用 Python 转换一下,可以使用 ctypes 或 win32api。