5

我在用:

for root, dirs, files in os.walk(rootDir):

浏览目录。都很酷。但是,我在当然有库抽象的 Windows 7 上运行。因此,例如图片库可能映射到c:\users\me并且c:\users\share 有什么方法可以将这个库抽象与 python 一起使用?

4

2 回答 2

3

除非我对这个功能的工作方式有误(我面前实际上没有 Win7 机器),否则您必须访问 Windows Shell API 才能访问库。

阅读MSDN Magazine 中的Introducing Libraries,似乎很清楚,仅处理文件系统的应用程序会将库视为常规目录,甚至没有任何迹象表明构成该库的各种分散目录。除非您始终坚持使用花哨的文件选择器对话框来获取所有路径(在这种情况下,用户会看到库,但最终总是选择特定的文件夹,因此您不必处理库),您必须明确使用外壳 API。

我认为您想从Windows 库开始作为开发指南,从IShellLibrary开始作为参考。

这些显然是 COM API,因此您可能希望使用win32com它从 Python 访问它们。(你可以使用ctypes和处理 C 风格的 COM 东西,但你真的不想这样做。)可能有人已经将这些 COM 对象封装在一个漂亮的 Python 接口中——我在快速 PyPI 中没有找到任何东西和 ActiveState 搜索,但您可能想尝试更认真的搜索。

或者,当然,您可以使用 IronPython 并使用 .NET API 而不是本机 API。

于 2013-02-20T21:13:08.973 回答
0

最新版本的 Pywin32 (218) 支持 shell 库接口:

import pythoncom
from win32com.shell import shell, shellcon
from win32com import storagecon
import os

kfm = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None,
        pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager)
libs_folder = kfm.GetFolder(shell.FOLDERID_Libraries)
libs_path = libs_folder.GetPath()

for lib_file in os.listdir(libs_path):
    if os.path.splitext(lib_file)[1] == '.library-ms':
        print lib_file
        i = shell.SHCreateItemFromParsingName(os.path.join(libs_path, lib_file),
                                              None, shell.IID_IShellItem)
        lib = pythoncom.CoCreateInstance(shell.CLSID_ShellLibrary, None,
                                         pythoncom.CLSCTX_INPROC, shell.IID_IShellLibrary)
        lib.LoadLibraryFromItem(i, storagecon.STGM_READ)
        for folder in lib.GetFolders():
            print '\t' + folder.GetDisplayName(shellcon.SHGDN_FORPARSING)
于 2013-02-22T04:17:28.043 回答