Datei in Papierkorb verschieben

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
EmmJott
Beiträge: 54
Registriert: 25.10.2024 12:23

Datei in Papierkorb verschieben

Beitrag von EmmJott »

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.
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!
EmmJott
Beiträge: 54
Registriert: 25.10.2024 12:23

Re: Datei in Papierkorb verschieben

Beitrag von EmmJott »

Mal die Eigeninitiative selbst ergriffen und folgendes gebastelt:

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")
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
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!
Benutzeravatar
Shardik
Beiträge: 749
Registriert: 25.01.2005 12:19

Re: Datei in Papierkorb verschieben

Beitrag von Shardik »

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:
  • 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
Ein Problem besteht darin, in der verwendeten Linux-Distribution den Pfad zur libgio-Bibliothek zu finden. Dies erfolgt in der Konsole durch Ausgabe aller Abhängigkeiten von PureBasic:

Code: Alles auswählen

ldd Pfad_zum_PureBasic_Verzeichnis/compilers/purebasic
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.

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
Antworten