63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
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}")
|