diff --git a/Knihovny/najdi_dropbox.py b/Knihovny/najdi_dropbox.py new file mode 100644 index 0000000..a6444d7 --- /dev/null +++ b/Knihovny/najdi_dropbox.py @@ -0,0 +1,62 @@ +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}")