Вы решаете эту проблему так же, как и ее: сначала вы найдете документацию и, в идеале, хороший код примера на C++, C# или VB, то вы выясните, как использовать PyWin32 для создания того же API-интерфейса оболочки или IKnownFolder
COM-вызовы с Python.
Как обзор документации MSDN по Known Folders говорит, вы можете использовать новую функцию оболочки обертку SHGetKnownFolderPath
вместо старого SHFolderPath
или SHGetFolderPath
, или вы можете использовать полный IKnownFolderManager
интерфейс через COM.
К сожалению, у меня нет машины 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, так что это не проблема.
Если вы хотели бы сделать это с помощью ctypes
чем 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, но мне нужно определить, что они динамически во время выполнения. Они не всегда имеют одинаковые варианты написания (разные языки) и могут находиться в разных местах в соответствии с групповой политикой и/или другими настройками. Этот список википедии также очень неполный. –