你解決這個問題的方式作爲一個相同的:首先,你發現在C++,C#或VB文檔和理想一些不錯的示例代碼,然後你找出如何使用PyWin32做出同樣的外殼API或者IKnownFolder
來自Python的COM調用。
由於上Known Folders的MSDN文檔概述說,你可以使用新的外殼包裝函數SHGetKnownFolderPath
而不是舊的SHFolderPath
或SHGetFolderPath
的,或者您也可以通過COM使用完整IKnownFolderManager
接口。
不幸的是,我沒有一臺Windows機器在我面前,MSDN的示例下載沒有響應,所以我將不得不做一些猜測。但它可能是這樣的:
from win32com.shell import shell, shellcon
path = shell.SHGetKnownFolderPath(shellcon.FOLDERID_AccountPictures,
0, # see KNOWN_FOLDER_FLAG
0) # current user
如果shellcon
沒有FOLDERID
值,你必須看看他們在KNOWNFOLDERID
和定義,你需要自己的常量。
如果shell
沒有SHGetKnownFolderPath
功能,你必須實例化一個IKnownFolderManager
並調用GetFolderByName
。
如果shell
甚至沒有IKnownFolderManager
...但Google的快速顯示it was added in build 218,所以這不會是一個問題。
如果您寧願通過做得比win32com
,將(再次,未經測試,因爲我沒有Windows中和MSDN的服務器壞了)是這個樣子:
from ctypes import windll, wintypes
from ctypes import *
from uuid import UUID
# ctypes GUID copied from MSDN sample code
class GUID(Structure):
_fields_ = [
("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)
]
def __init__(self, uuidstr):
uuid = UUID(uuidstr)
Structure.__init__(self)
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid.fields
for i in range(2, 8):
self.Data4[i] = rest>>(8-i-1)*8 & 0xff
FOLDERID_AccountPictures = '{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}'
SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath
SHGetKnownFolderPath.argtypes = [
POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, POINTER(c_char_p)]
def get_known_folder_path(uuidstr):
pathptr = c_wchar_p()
guid = GUID(uuidstr)
if SHGetKnownFolderPath(byref(guid), 0, 0, byref(pathptr)):
raise Exception('Whatever you want here...')
return pathptr.value
維基百科在** http://en.wikipedia.org/wiki/Special_folder#List_of_special_folders** – Marichyasana
上有一個列表。謝謝@Marichyasana,但我需要確定它們在運行時是什麼動態的。它們並不總是具有相同的拼寫(不同的語言),並且可以根據組策略和/或其他自定義設置在不同的位置。該維基百科列表也非常不完整。 –