在python中确定Windows special-folders和known-folders路径的最佳方法是什么?
我已经为SpecialFolders发现了几种流行的方法,a.k.a CSIDL,但KNOWNFOLDERID还没有直截了当的方法。保持向后兼容性,因此CSIDL方法仍然有效,但是自那时起不会枚举自Windows XP以来引入的任何特殊/已知文件夹。 “新”不可用的示例包括下载,播放列表,程序文件x64。
特殊文件夹
Find system folder locations in Python - 最简单的CSIDL方法,依赖于win32com,适用于 AllUsersDesktop,AllUsersStartMenu,AllUsersPrograms,AllUsersStartup,桌面,收藏夹,字体,MyDocuments,NetHood,PrintHood,Recent,SendTo,StartMenu ,初创公司模板(列表可能不完整)。
How to get path of Start Menu's Programs directory? - 采用与上述相同的方法,以及直接使用ctypes的方法,因此不需要win32com(不那么明确或直截了当)
已知文件夹
两者合二为一
答案 0 :(得分:2)
您可以像解决这个问题一样解决这个问题:首先,您可以在C ++,C#或VB中找到文档和理想情况下的一些不错的示例代码,然后您将弄清楚如何使用PyWin32来生成相同的shell API或{{ 1}}来自Python的COM调用。
正如Known Folders上的MSDN概述文档所述,您可以使用新的shell包装函数SHGetKnownFolderPath
而不是旧的IKnownFolder
或SHFolderPath
,或者您可以使用通过COM完成IKnownFolderManager
接口。
不幸的是,我面前没有Windows机器,MSDN的示例下载没有响应,所以我不得不做一些猜测。但它可能是这样的:
SHGetFolderPath
如果from win32com.shell import shell, shellcon
path = shell.SHGetKnownFolderPath(shellcon.FOLDERID_AccountPictures,
0, # see KNOWN_FOLDER_FLAG
0) # current user
没有shellcon
值,则必须在KNOWNFOLDERID
上查找它们并定义自己需要的常量。
如果FOLDERID
没有shell
功能,则必须实例化SHGetKnownFolderPath
并致电IKnownFolderManager
。
如果GetFolderByName
甚至没有shell
...但是Google会快速显示it was added in build 218,那么这不会成为问题。
如果您宁愿通过IKnownFolderManager
而不是ctypes
进行此操作,它看起来会像这样(再次,未经测试,因为我没有Windows框,MSDN的服务器已损坏):< / p>
win32com