在win32中读取symlink/junction point的目标(通过Python)

2024-09-28 01:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

任务和背景:
在win32平台中创建、回读、删除指向目录的链接。
我在python代码中遵循的方法是,按顺序
a、 尝试创建真正的符号链接(如果支持)(通过mklink cmd)
b、 如果不支持,则返回到创建连接点(如果支持的话)(通过linkd cmd)
读取和删除遵循相同的方法。在

问题:
symlink和juncpt的创建和删除很简单,但我无法理解如何读取目标,即指向目录。在

进展:
a、 对于连接点,我可以使用'linkd'并以一种难看的方式解析stdout来获取target dir。
b、 对于symlink,似乎没有这样的解决方案。
c、 我看到python3.1.1[1]对win32symlinks有本地支持,但是使用的是v2.7.1,现在无法升级。 d、 pywin32模块中有创建symlink的方法,但我看不到任何方法来读回它

p.s.我对Python很陌生,所以如果有其他方法可以轻松完成这一点,请告诉我。在

[1][http://bugs.python.org/issue1578269][1]


Tags: 方法代码目录cmd顺序链接符号平台
3条回答

都是关于reparse points。在

这篇Code Project文章应该提供您需要的信息。您必须使用ctypes或win32api将其转换为Python。在

除了一些关于如何使用ctypes模块创建符号链接的文章外,您还可以找到一个使用win32file module here读取符号链接的文章。我还编写了一个Python C-Extension here实现Windows上的连接、符号链接和硬链接,不过我要提醒您,它需要进行一次认真的检查。(在真正阅读PythonC-Extensions之前写的,所以我没有真正把适当的Py_-XREF,etcs放在适当的位置上)

还有一个只使用存储库中某个ctypes模块的读、写和检查连接的实现。在

Win32file库对我也不起作用。但是如果你有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

如果不想依赖于连接,还可以解析DIR /A:L输出。在

相关问题 更多 >

    热门问题