For extracting paths of library directories (like "Documents", "Music" etc), a function SHGetFolderPath was used from "from win32com.shell import shell". This one stopped working, despite the post install of win32.
Maybe this can be repaired. If not, we don't go further than platformdirs goes. Oops, the functions are here too!! platformdirs, windows.py, near line 200...
def get_win_folder_via_ctypes(csidl_name: str) -> str:
"""Get folder with ctypes."""
# There is no 'CSIDL_DOWNLOADS'.
# Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead.
# https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid
csidl_const = {
"CSIDL_APPDATA": 26,
"CSIDL_COMMON_APPDATA": 35,
"CSIDL_LOCAL_APPDATA": 28,
"CSIDL_PERSONAL": 5,
"CSIDL_MYPICTURES": 39,
"CSIDL_MYVIDEO": 14,
"CSIDL_MYMUSIC": 13,
"CSIDL_DOWNLOADS": 40,
"CSIDL_DESKTOPDIRECTORY": 16,
}.get(csidl_name)
if csidl_const is None:
msg = f"Unknown CSIDL name: {csidl_name}"
raise ValueError(msg)
buf = ctypes.create_unicode_buffer(1024)
windll = getattr(ctypes, "windll") # noqa: B009 # using getattr to avoid false positive with mypy type checker
windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
# Downgrade to short path name if it has high-bit chars.
if any(ord(c) > 255 for c in buf): # noqa: PLR2004
buf2 = ctypes.create_unicode_buffer(1024)
if windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
buf = buf2
if csidl_name == "CSIDL_DOWNLOADS":
return os.path.join(buf.value, "Downloads") # noqa: PTH118
return buf.value
I think, only stick to this. I will try first (Quintijn)
For extracting paths of library directories (like "Documents", "Music" etc), a function SHGetFolderPath was used from "from win32com.shell import shell". This one stopped working, despite the post install of win32.
Maybe this can be repaired. If not, we don't go further than platformdirs goes. Oops, the functions are here too!! platformdirs, windows.py, near line 200...
I think, only stick to this. I will try first (Quintijn)