我在用:
for root, dirs, files in os.walk(rootDir):
浏览目录。都很酷。但是,我在当然有库抽象的 Windows 7 上运行。因此,例如图片库可能映射到c:\users\me
并且c:\users\share
有什么方法可以将这个库抽象与 python 一起使用?
我在用:
for root, dirs, files in os.walk(rootDir):
浏览目录。都很酷。但是,我在当然有库抽象的 Windows 7 上运行。因此,例如图片库可能映射到c:\users\me
并且c:\users\share
有什么方法可以将这个库抽象与 python 一起使用?
除非我对这个功能的工作方式有误(我面前实际上没有 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。
最新版本的 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)