Код: Выделить всё
import os
import ctypes
import logging
from ctypes import windll, byref, create_unicode_buffer, Structure, c_uint32, c_uint16, c_uint8
from uuid import UUID
# Logging instellen
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
class GUID(Structure):
_fields_ = [
("Data1", ctypes.c_uint32),
("Data2", ctypes.c_uint16),
("Data3", ctypes.c_uint16),
("Data4", ctypes.c_uint8 * 8)
]
def string_to_guid(guid_string):
"""Converteer een GUID-string naar een ctypes GUID-structuur."""
guid = UUID(guid_string)
return GUID(
guid.fields[0],
guid.fields[1],
guid.fields[2],
(ctypes.c_uint8 * 8)(*guid.fields[3:])
)
def get_known_folder_path(folder_id):
"""Haal het pad op van een bekende Windows-map via GUID."""
try:
guid = string_to_guid(folder_id)
path_buf = create_unicode_buffer(260) # Buffer voor het pad
result = windll.shell32.SHGetKnownFolderPath(byref(guid), 0, None, byref(path_buf))
if result == 0:
path = path_buf.value
logging.info("Map gevonden: %s", path)
return path
else:
logging.error("SHGetKnownFolderPath fout: %s", result)
return None
except Exception as e:
logging.error("Fout bij ophalen map: %s", e)
return None
if __name__ == "__main__":
# GUID's voor standaard Windows-mappen
known_folders = {
"Desktop": "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}",
"Documents": "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}",
"Pictures": "{33E28130-4E1E-4676-835A-98395C3BC3BB}",
"Videos": "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}",
"Downloads": "{374DE290-123F-4565-9164-39C4925E467B}",
}
for folder_name, folder_guid in known_folders.items():
logging.info("Controleren of %s bestaat...", folder_name)
folder_path = get_known_folder_path(folder_guid)
if folder_path:
logging.info("Pad voor %s: %s", folder_name, folder_path)
else:
logging.error("Kon het pad voor %s niet ophalen.", folder_name)
Вот основная логика моего скрипта:
- Преобразуйте строки GUID в структуры GUID ctypes.
- Использование SHGetKnownFolderPath для получения путей к папкам.
Код: Выделить всё
import os import ctypes import logging from ctypes import windll, byref, create_unicode_buffer, Structure, c_uint32, c_uint16, c_uint8 from uuid import UUID # Set up logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) class GUID(Structure): """Define a GUID structure compatible with ctypes.""" _fields_ = [ ("Data1", ctypes.c_uint32), ("Data2", ctypes.c_uint16), ("Data3", ctypes.c_uint16), ("Data4", ctypes.c_uint8 * 8) ] def string_to_guid(guid_string): """Convert a GUID string into a ctypes-compatible GUID structure.""" guid = UUID(guid_string) guid_struct = GUID( guid.fields[0], guid.fields[1], guid.fields[2], (ctypes.c_uint8 * 8)(*guid.fields[3:]) ) logging.info("GUID string: %s", guid_string) logging.info("GUID struct: %s", guid_struct) return guid_struct def get_known_folder_path(folder_id): """ Retrieve the path of a known Windows folder using its GUID. Uses the SHGetKnownFolderPath function from the Windows API. """ try: guid = string_to_guid(folder_id) path_buf = create_unicode_buffer(260) # Buffer for the path result = windll.shell32.SHGetKnownFolderPath(byref(guid), 0, None, byref(path_buf)) logging.info("Result code: %s", result) if result == 0: path = path_buf.value logging.info("Folder found: %s", path) return path else: logging.error("SHGetKnownFolderPath error: %s", result) return None except Exception as e: logging.error("Error retrieving folder: %s", e) return None def debug_system_error(): """Retrieve additional error details using GetLastError.""" error_code = windll.kernel32.GetLastError() logging.error("GetLastError: %s", error_code) if __name__ == "__main__": # GUIDs for standard Windows folders known_folders = { "Desktop": "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}", "Documents": "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}", "Pictures": "{33E28130-4E1E-4676-835A-98395C3BC3BB}", "Videos": "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}", "Downloads": "{374DE290-123F-4565-9164-39C4925E467B}", } # Test using SHGetKnownFolderPath for folder_name, folder_guid in known_folders.items(): logging.info("Checking if %s exists...", folder_name) folder_path = get_known_folder_path(folder_guid) if folder_path: logging.info("Path for %s: %s", folder_name, folder_path) else: logging.error("Could not retrieve path for %s.", folder_name) debug_system_error()
22.12.2024 19:21:27 - ИНФОРМАЦИЯ - строка GUID: {B4BFCC3A-DB2C-424C-B029-7FE99A87C641
22 декабря 2024 г. 19:21:27 - ИНФОРМАЦИЯ - Структура GUID:
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 - ОШИБКА - Не удалось получить путь для рабочего стола.
2024-12-22 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка существования документов...
2024-12-22 19:21:27 - INFO - строка GUID: {FDD39AD0-238F-46AF-ADB4-6C85480369C7
22 декабря 2024 19:21:27 - INFO - структура GUID: < _main_.GUID объект в 0x000001DD9FA0F650>
22 декабря 2024 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
22 декабря 2024 19:21 :27 — ОШИБКА — ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 — ОШИБКА — не удалось получить путь к документам.
22 декабря 2024 г. 19 :21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ – Проверка существования изображений...
2024-12-22 19:21:27 – ИНФОРМАЦИЯ – строка GUID: {33E28130-4E1E-4676-835A-98395C3BC3BB >
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Структура GUID: Объект
22 декабря 2024 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
2024-12-22 19:21:27 — ОШИБКА — не удалось получить путь для изображений.
2024-12 -22 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка существования видео...
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - GUID строка: {18989B1D-99B5-455B-841C-AB7C74E4DDFC
22 декабря 2024 19:21:27 - INFO - Структура GUID: объект
2024 -12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Не удалось получить путь для видео.
22 декабря 2024 г. 19:21:27 - ОШИБКА - GetLastError: 0
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Проверка наличия загрузок...
22 декабря 2024 г., 19:21:27 - ИНФОРМАЦИЯ - строка GUID: {374DE290-123F-4565-9164-39C4925E467B
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Структура GUID:
2024-12-22 19:21:27 - ИНФОРМАЦИЯ - Код результата: -2147024894
2024-12-22 19:21:27 - ОШИБКА - Ошибка SHGetKnownFolderPath: -2147024894
22 декабря 2024 г. 19:21:27 - ОШИБКА - Не удалось получить путь для загрузок.
2024-12-22 19:21:27 - ОШИБКА - GetLastError: 0
Подробнее здесь: https://stackoverflow.com/questions/793 ... guids-on-a
Мобильная версия