Ablageort für die anwendungsweite Konfiguration #3
Notifications
Due Date
No due date set.
Blocks
#4 Dateiformate: App-Konfiguration und .dionotes-Marker
RDietermann/dionotes-client
Reference: RDietermann/dionotes-client#3
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #1
Question
Wo legt eine Desktop-App unter Windows (und, falls billig zu beantworten, macOS/Linux) ihre anwendungsweiten Konfigurationsdaten ab — und wie ermittelt man diesen Pfad in Rust?
Hintergrund: Die Liste zuletzt benutzter Workspaces muss außerhalb jedes Workspace liegen, sonst kann man sie nicht lesen, bevor ein Workspace geöffnet ist.
Konkret zu klären:
dirs,directories, etwas anderes)? Welche wird gepflegt?%APPDATA%(Roaming) oder%LOCALAPPDATA%?Zielgröße: ein konkreter Pfad für DioNotes unter Windows, plus der Rust-Aufruf, der ihn liefert.
Antwort
Crate:
directories6.0.0 (Release 2025-01-12). Zusammen mit dem Geschwister-Cratedirs6.0.0 der De-facto-Standard (dirs: ~308 Mio. Downloads, ~72 Mio. in 90 Tagen). Wartungslage ehrlich: Die GitHub-Repos sind seit 2025-02-18 archiviert und nach https://codeberg.org/dirs/directories-rs umgezogen; dort nicht archiviert, aber seit dem 6.0.0-Release nur noch README-/Metadaten-Commits. Also: gepflegt-aber-fertig, kein Risiko für "gib mir einen Pfad". Aktive Alternative wäreetcetera0.11.0 (2025-10-28) — bringt uns aber nichts.Nebenbefund:
dirs 6.0.0liegt bereits transitiv in unsererCargo.lock(überwryundtray-icon).directorieshängt nur andirs-sys ^0.5.0— kostet also genau eine zusätzlich kompilierte Crate.Konkrete Pfade
Windows:
Linux:
macOS:
~/Library/Application Support/DioNotes/recent-workspaces.jsonRust-Aufruf — ein Ausdruck, alle drei Plattformen:
Bewusst kein
#[cfg(target_os = ...)]— die Fallunterscheidung steckt schon imOption, dasdirectorieszurückgibt. Windows-Werte auf diesem Rechner ausgeführt und verifiziert (state_dir() = None, Fallback greift); Linux/macOS aus dem Quelltext vondirectories6.0.0 abgeleitet.Linux: es ist nicht
~/.configDer Punkt, der mich beim Nachrecherchieren die Empfehlung hat ändern lassen. XDG kennt neben
configunddatanoch$XDG_STATE_HOME(Default~/.local/state). Spec 0.8, wörtlich:Das ist keine Auslegung: Die Spec nennt "recently used files" und "open files" namentlich. Unsere Workspace-Liste ist unter Linux State, nicht Config.
directoriesbildet das ab und liefertstate_dir()nur dort, wo es das Konzept gibt —Some("~/.local/state/dionotes")unter Linux,Noneunter Windows (src/win.rsZ. 89) und macOS (src/mac.rsZ. 83).Zwei weitere Linux-Punkte:
directoriesautomatisch (trim_and_lowercase_then_replace_spacesinsrc/lin.rs): aus"DioNotes"wirddionotes. Mitdirsallein bekäme man~/.config/DioNotes— unschön. Das ist das stärkste Einzelargument fürdirectoriesstattdirs.directoriesliest die XDG-Variablen zur Laufzeit, eine Sandbox, die sie umbiegt, wird automatisch respektiert. (Ob die gespeicherten absoluten Workspace-Pfade aus einer Sandbox erreichbar sind, ist ein separates Thema.)Windows:
%LOCALAPPDATA%, nicht%APPDATA%Die Windows-Konvention fragt nicht "Konfiguration oder Daten?", sondern "maschinenunabhängig oder maschinenspezifisch?". Microsoft wörtlich:
Bestätigt in der aktuell gepflegten .NET-Doku:
ApplicationData= "for the current roaming user",LocalApplicationData= "used by the current, non-roaming user" (https://learn.microsoft.com/en-us/dotnet/api/system.environment.specialfolder).Die Workspace-Liste besteht aus absoluten Dateisystempfaden. Ein
D:\Notizen\Privatexistiert auf einem zweiten Rechner nicht — maschinenspezifisch, also Local. Dazu der Fehlermodus von Roaming: Synchronisiert wird beim Ab-/Anmelden, bei paralleler Nutzung gewinnt die letzte Abmeldung und überschreibt die andere Sitzung.Wichtig: Diese Entscheidung ist rein Windows-spezifisch und kostet anderswo nichts — unter Linux und macOS ist
config_local_dirim Quelltext einconfig_dir.clone(), also derselbe Pfad.Nicht zu benutzen:
cache_dir()(löschbar),data_dir()/data_local_dir()(Nutzdaten),preference_dir()(zeigt auf macOS nach~/Library/Preferences, und dorthin darf man laut Apple nicht selbst schreiben).Dioxus 0.7: keine eigene Abstraktion
dioxus_desktop::Config::with_data_directoryklingt richtig, ist es aber nicht. Der Wert landet inWebContext::new(cfg.data_dir.clone())(packages/desktop/src/webview.rs@ v0.7.1), undwry::WebContextist das Browser-Profil der WebView — WebView2-Cookies, LocalStorage, Cache. Nicht die Anwendungskonfiguration.Ansonsten: nichts Passendes in der Item-Liste von
dioxus0.7.1, kein Treffer in zwei unabhängigen Doku-Korpora, nichts in unsererAGENTS.md. Und das offizielle Dioxus-SDK greift für seinenuse_persistent-Storage selbst zudirectories::BaseDirs::new().unwrap().data_local_dir()— gäbe es etwas Eingebautes, hätte es das benutzt.Verzeichnis anlegen: ja
Die Crate legt nichts an. README wörtlich: "This library does not create directories or check for their existence. The library only provides information on what the path to a certain directory should be."
Verifiziert:
%LOCALAPPDATA%\DioNotesexistiert auf meinem Rechner nicht. Die Basis-Ordner%APPDATA%/%LOCALAPPDATA%dagegen schon —PERUSER-Known-Folders, kommen mit dem Benutzerprofil. Anzulegen ist nur der App-Teil, perstd::fs::create_dir_all(idempotent). Unter Linux erwartet die XDG-Spec dasselbe ausdrücklich: "When attempting to write a file, if the destination directory is non-existent an attempt should be made to create it with permission0700."Langfassung mit allen Quellenangaben und der Trennung belegt/Vermutung: Branch
research/config-ablageort, Dateidocs/research/konfigurations-ablageort.md(nicht gepusht).