Papierkorb unter Rust: Crate, Netzlaufwerke, Kosten #21
Notifications
Due Date
No due date set.
Blocks
#24 Notizen loeschen
RDietermann/dionotes-client
Reference: RDietermann/dionotes-client#21
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 #16
Question
Wie löscht eine Rust-Desktop-App unter Windows eine Datei so, dass sie im Papierkorb landet — und was kostet das?
Entschieden ist: Gelöscht wird in den Papierkorb des Betriebssystems, nicht in einen eigenen. Offen ist das Wie.
Konkret zu klären:
trash?), wird sie gepflegt, welche Version? Wie viele zusätzliche Pakete zieht sie in den Abhängigkeitsgraph — und lässt sich das über Features begrenzen, wie es beirfdnötig war?Zielgröße: eine benennbare Crate mit Version, ein Aufruf-Snippet, und eine klare Aussage zum Netzlaufwerk-Fall.
Papierkorb unter Rust: Ergebnis
Crate:
trash, aktuell 5.2.6 (2026-05-03), gepflegt aus https://github.com/Byron/trash-rs, MIT, rust-version 1.85.Kosten: +6 Pakete, und die kriegt man nicht weg
Ein Gegenstueck zum
rfd/Wayland-Fall gibt es hier nicht. Die viercoinit_*-Features vontrashhaben leere Dependency-Listen, und das einzige wirksame Feature (chrono) ist nur untercfg(unix)deklariert —--no-default-featuresspart unter Windows exakt null.--no-default-featuresFuenf der sechs sind eine zweite Kopie der windows-Crate-Familie:
trashhaengt aufwindows 0.56.0, im Lock steht ueber dioxus/wry bereits0.61.3— semver-inkompatibel, wird nicht dedupliziert. Auf Linux ist es harmlos (reines Rust, kein GTK/dbus), auf macOS praktisch gratis.Netzlaufwerke — die wichtigste Frage, und die Antwort ist unangenehm
Nicht erschlossen, sondern gegen ein echtes SMB-Share gemessen. Es sind zwei getrennte Probleme:
1.
trash 5.2.6funktioniert auf Netzlaufwerken gar nicht.Ursache ist ein Pfad-Bug, kein Papierkorb-Thema:
trashkanonisiert viastd::fs::canonicalizeund schneidet dann stumpf\\?\ab. Aus\\?\UNC\server\sharewirdUNC\server\share— Unsinn. Betrifft gemappte Laufwerksbuchstaben und UNC-Pfade gleichermassen. Das ist der seit 2022 offene Bug trash-rs#55. Immerhin: es geht nichts verloren, die Datei bleibt liegen.2. Waere der Bug behoben, waere es gefaehrlich.
IFileOperationdirekt, gleiche Flags, unverbogener Pfad:Windows loescht auf Netzlaufwerken still und endgueltig und meldet denselben Erfolg wie beim Recyceln.
FOF_WANTNUKEWARNINGloest dabei keinen Dialog aus (trashsetzt zusaetzlichFOF_SILENT|FOF_NOERRORUI).=> Ja, die App braucht eine Rueckfrage vor dem Loeschen. Auf
Ok(())zu vertrauen reicht nicht.Wie erfaehrt das Programm, was passiert ist?
Ueber
trashgar nicht — keine Error-Variante druckt das aus, im kritischen Fall kommtOk(()).Zuverlaessig geht es nur ueber
IFileOperationProgressSink, gemessen:PreDeleteItemdwFlagsPostDeleteItempsiNewlyCreated0x282(enthaeltTSF_DELETE_RECYCLE_IF_POSSIBLE)Some->$Recycle.Bin\...\$R1V9IFD.md0x202(Bit fehlt)Microsoft dokumentiert das woertlich: "If the item was fully deleted, this value is NULL." Windows sagt sogar schon vor dem Loeschen (in
PreDeleteItem) per Flag-Bit, ob es recyceln wird.hrDeletetaugt nicht — in beiden Faellen identisch0x00270008.Haken:
trashuebergibt den Sink hart alsNone(pfo.DeleteItem(&shi, None)). Ueber die Crate-API kommt man nicht heran.Blockierend, und schnell
Synchron, kein Thread-Spawn. Die Dateigroesse ist egal — 512 MiB lokal in 26,7 ms (Rename im selben Volume). Was kostet, ist der erste Aufruf im Prozess: 740 ms COM-Init. Netzlaufwerk ~0,3-0,4 s. Gehoert nicht in den UI-Thread, sonst unkritisch.
macOS / Linux
macOS:
Finder(AppleScript, Default) oderNsFileManager(trashItemAtURL, schneller, aber ohne "Put Back"). Deps stehen schon im Lock. Linux: FreeDesktop-Spec v1.0, legt Trash-Ordner selbst an, faellt bei Cross-Device auf copy+delete zurueck — ein stilles endgueltiges Loeschen ist dort im Code nicht angelegt.Nicht belastbar beantwortet
USB-Sticks. Die beiden Wechseldatentraeger im Testrechner sind leere Kartenleser. Vermutung (ausdruecklich ungeprueft): lokale Wechselmedien bekommen sehr wohl einen
$RECYCLE.BIN, der kritische Fall ist das Netzlaufwerk. Vor der Implementierung mit einem echten Stick nachmessen. Ebenfalls ungeprueft: der pro Volume abschaltbare Papierkorb auf lokalem NTFS — eine Pruefung, die nur den Laufwerkstyp anschaut, greift zu kurz.Ausfuehrliche Fassung mit allen Rohausgaben, Quellcode-Zitaten und Quellen-URLs:
docs/research/papierkorb.md, Branchresearch/papierkorb(nicht gepusht).Cargo.toml/Cargo.locksind unveraendert.