Hallo allerseits,
wie verschiebt man in Linux (allgemein, ggf. im aktuellen Kubuntu im Besonderen) eine Datei in den Paierkorb?
Edit: Gebe gerne zu, die Frage uneindeutig formuliert zu haben. Es geht mir darum, in meinem Programm eine Datei nicht zu löschen (deletefile), sondern stattdessen in den Papierkorb zu schieben. Die Frage war also nicht, wie man eine Datei in der GUI in den Papierkorb oder sonstwohin schafft.
Datei in Papierkorb verschieben
Datei in Papierkorb verschieben
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Re: Datei in Papierkorb verschieben
Mal die Eigeninitiative selbst ergriffen und folgendes gebastelt:
würde die Datei test.txt in den Papierkorb schieben.
Keine Ahnung, ob das Gebastelte die Anforderungen voll erfüllt oder nur scheinbar funktioniert. Habe das auch erstmal auf einzelne Dateien beschränkt, Verzeichnisse müssten da wohl etwas anders gehandhabt werden.
Meine Fragen wären jetzt noch:
* Muss das Betriebssystem darüber informiert werden, dass sich was im Trash verändert hat. Wenn ja, wie?
* Muss die fortlaufende Nummerierung zur Chronologie passen oder ist das egal, da es nur um die Unterscheidung der Dateien geht.
Vielleicht kann da jemand noch etwas mehr Licht ins Dunkel bringen
Code: Alles auswählen
Procedure trashfile(file$)
If FileSize(file$) = -2 : ProcedureReturn #False : EndIf
targetdir1$ = GetHomeDirectory() + ".local/share/Trash/files/"
targetdir2$ = GetHomeDirectory() + ".local/share/Trash/info/"
targetfile$ = GetFilePart(file$)
If FileSize(targetdir1$ + targetfile$) >= 0
; eine Datei mit gleichem Namen existiert bereits im Trash
; Prüfung, ob eine Datei mit Zählklammer (1) besteht und wenn ja, (2), (3), usw. testen
counter = 1
While FileSize(targetdir1$ + targetfile$ + "(" + Str(counter) + ")") >= 0
counter + 1 ; Zähler ums 1 erhöhen
Wend
targetfile$ = targetfile$ + "(" + Str(counter) + ")"
EndIf
result = RenameFile(file$, targetdir1$ + targetfile$)
If result
;wenn verschieben erfolgreich
cf = CreateFile(#PB_Any, targetdir2$ + targetfile$ + ".trashinfo")
If cf
;wenn Trashinfo erstellt werden kann
WriteStringN(cf, "[Trash Info]")
WriteStringN(cf, "Path=" + file$)
WriteStringN(cf, "DeletionDate=" + FormatDate("%yyyy-%mm-%ddT%hh:%ii:%ss", Date()))
CloseFile(cf)
ProcedureReturn #True
Else
;Fehler bei Erstellen der Trashinfo -> Datei wieder restaurieren
RenameFile(targetdir1$ + targetfile$, file$)
ProcedureReturn #False
EndIf
Else
;wenn verschieben nicht erfolgreich
ProcedureReturn #False
EndIf
EndProcedure
Code: Alles auswählen
trashfile("/home/fritz/Downloads/test.txt")Keine Ahnung, ob das Gebastelte die Anforderungen voll erfüllt oder nur scheinbar funktioniert. Habe das auch erstmal auf einzelne Dateien beschränkt, Verzeichnisse müssten da wohl etwas anders gehandhabt werden.
Meine Fragen wären jetzt noch:
* Muss das Betriebssystem darüber informiert werden, dass sich was im Trash verändert hat. Wenn ja, wie?
* Muss die fortlaufende Nummerierung zur Chronologie passen oder ist das egal, da es nur um die Unterscheidung der Dateien geht.
Vielleicht kann da jemand noch etwas mehr Licht ins Dunkel bringen
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Re: Datei in Papierkorb verschieben
Leider ist in Linux das Verschieben einer Datei in den Papierkorb nicht trivial. Denn dies ist abhängig von der Desktop-Umgebung (wie z.B. Gnome, KDE, Cinnamon, Xfce, Mate usw. und dem eingesetzten Datei-Manager), die dies leider teilweise unterschiedlich handhaben. Ich habe daher einen Weg gewählt, der in möglichst vielen Desktop-Umgebungen funktionieren sollte, indem er die Funktion g_file_trash() der GIO-Bibliothek nutzt. Ich habe das folgende Beispielprogramm bisher auf diesen 5 Linux-Distributionen mit 5 verschiedenen Desktop-Umgebungen erfolgreich getestet:
In der dann erscheinenden Liste sucht man nach der libgio-Bibliothek und kopiert dann den Pfad und Bibliotheksnamen hinter die ImportC-Anweisung im Beispiel-Programm.
- AntiX 21 'Grup Yorum' x86 mit Rox-IceWM und PB 5.73 x86
- Debian 12 'Bookworm' x86 mit Gnome und PB 5.73 x86
- Kubuntu 18.04 x86 mit KDE und PB 5.73 x86
- Linux Mint 21.3 x64 mit Cinnamon und PB 6.30 x64 Beta 3
- Linux MX 19.4 x86 mit Xfce und PB 5.73 x86
Code: Alles auswählen
ldd Pfad_zum_PureBasic_Verzeichnis/compilers/purebasic
Code: Alles auswählen
EnableExplicit
#Filename = "Test.Txt"
; ----- Linux Mint 21.3 x64 'Virginia'
ImportC "/lib/x86_64-linux-gnu/libgio-2.0.so"
; ----- AntiX 21 'Grup Zorum' x86
; Debian 12 'Bookworm' x86
; Kubuntu 18.04 x86
; Linux MX 19.4 x86
; ImportC "/usr/lib/i386-linux-gnu/libgio-2.0.so"
g_file_new_for_path(FilePath.P-UTF8)
g_file_trash(*File, Cancellable.I, *Error.GError)
EndImport
Procedure MoveFileToTrashCan(PathAndFilename.S)
Protected *Error.GError
Protected *File
*File = g_file_new_for_path(PathAndFilename)
If g_file_trash(*File, 0, *Error)
MessageRequester("Info",
"Die Datei" + #CR$ +
PathAndFilename + #CR$ +
"wurde erfolgreich in den Paperkorb verschoben!",
#PB_MessageRequester_Info)
Else
MessageRequester("Fehler",
"Das Verschieben der Datei" + #CR$ +
PathAndFilename + #CR$ +
"in den Paperkorb ist fehlgeschlagen!",
#PB_MessageRequester_Error)
EndIf
EndProcedure
If CreateFile(0, GetTemporaryDirectory() + #Filename)
MoveFileToTrashCan(GetTemporaryDirectory() + #Filename)
EndIf