import winreg import json import os def get_dropbox_root() -> str: """ Vrátí kořenovou cestu složky Dropbox na tomto počítači. Dropbox může být nainstalován na různých discích (C:, U:, Z: …), ale struktura složek uvnitř zůstává vždy stejná. Tato funkce zjistí aktuální umístění, takže ostatní skripty nemusí cestu napevno zadávat. Postup hledání (v tomto pořadí): 1. Registr HKCU\\Software\\Dropbox\\ks — hlavní klíč, hodnota "Personal" je uložena jako byte array v kódování UTF-16 LE. 2. Registr HKCU\\Software\\Dropbox\\ks1 — alternativní klíč používaný novějšími verzemi klienta Dropbox. 3. Soubor info.json v %APPDATA%\\Dropbox\\ nebo %LOCALAPPDATA%\\Dropbox\\ — záložní metoda, pokud registr cestu neobsahuje. Vrací: str: Absolutní cesta ke kořenové složce Dropboxu, např. "U:\\Dropbox". Vyvolá: RuntimeError: Pokud se cestu nepodaří zjistit žádnou z metod. Příklad použití: from Knihovny.najdi_dropbox import get_dropbox_root import os ROOT = get_dropbox_root() PACIENTI = os.path.join(ROOT, "Ordinace", "Pacienti") """ # Metoda 1 a 2: registr HKCU\Software\Dropbox\ks a ks1 for subkey in (r"Software\Dropbox\ks", r"Software\Dropbox\ks1"): try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey) as key: value, _ = winreg.QueryValueEx(key, "Personal") path = bytes(value).decode("utf-16-le").rstrip("\x00") if path: return path except (OSError, UnicodeDecodeError): continue # Metoda 3: záložní — info.json v AppData for base in (os.getenv("APPDATA", ""), os.getenv("LOCALAPPDATA", "")): info_path = os.path.join(base, "Dropbox", "info.json") if os.path.isfile(info_path): with open(info_path, encoding="utf-8") as f: info = json.load(f) path = (info.get("personal") or info.get("business") or {}).get("path", "") if path: return path raise RuntimeError("Nepodařilo se zjistit cestu k Dropboxu.") if __name__ == "__main__": root = get_dropbox_root() print(f"Dropbox root: {root}")