AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datei aus dem Papierkorb wiederherstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Datei aus dem Papierkorb wiederherstellen

Ein Thema von Benmik · begonnen am 27. Aug 2014 · letzter Beitrag vom 28. Aug 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Datei aus dem Papierkorb wiederherstellen

  Alt 27. Aug 2014, 08:52
Vorneweg: Top!

Konvertiere das doch in eine Klasse. Einfach die lokalen Prozeduren in private Methoden überführen und die Hauptprozedur als public deklarieren.
Dann würde ich für das IDL-Zeugs kein Record nehmen, sondern eine Klasse und das in eine TObjectList packen. Damit ist das aufräumen erledigt (OwnsObject = true).
Deine Prozedur muss aufgeräumt werden. Ein 'try..finally LeerePIDLListe end' um alles herum erspaart dir die einzelnen Aufruf von 'LeerePIDLListe', denn bei einem 'exit' wird vorher der finally-Abschnitt aufgerufen.
Und dann würde ich jeden einzelnen Schritt in der Prozedur in eine eigene Methode packen, z.B. aus :
Delphi-Quellcode:
// code above gets the Recycle Bin IShellFoldr Interface in RecycleI
PapierkorbDateienAuflisten;
For i := 0 to PIDLListe.Count - 1 do begin
  If SameText(PPIDLItem(PIDLListe[i])^.Dateiname,Dateiname) then begin
    pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
    break;
  end;
If i = PIDLListe.Count - 1 then begin
// das ist eh falsch, denn i ist = PIDLListe.Count, wenn nichts gefunden wurde
  // LeerePIDLListe;
  exit;
end;
wird (was passiert denn den da?)
Delphi-Quellcode:
Const
  NotFound = -1;
...
  i := FindeNameInListe(Dateiname);
  if i = NotFound then exit; //
  pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
  ...
und
Delphi-Quellcode:
function TPapierkorb.FindeNameInListe (const Dateiname : String) : Integer;
Begin
  For result := 0 to PIDLListe.Count - 1 do
    If SameText(PPIDLItem(PIDLListe[result])^.Dateiname,Dateiname) then
      exit;

  Result := -1 // nicht gefunden
End;
Extrahiere die Einzelschritte so, das jeder Schritt genau einen kleinen Beitrag zur Gesamtlösung liefert. Hier: "Sucht einen Dateinamen in der Liste und liefert den Index oder -1, wenn der Name nicht gefunden wurde". Mehr macht das Teil nicht und mehr muss es auch nicht machen.

Deine Routine sähe dann in etwa so aus:
Delphi-Quellcode:
Procedure TPapierkorb.StelleDateiWiederher(const Dateiname : String);
...
begin
  Result := False;
  Try
    PIDLListe := TObjectList.Create(true);
    RecycleI := GetRecycleBinInterace();
    PapierkorbDateienAuflisten (PIDLListe);
    i := FindeNameInListe(Dateiname);
    if i=-1 then exit; //
    pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
    
    If pItemIDL <> nil then
      RecycleFile(RecycleI, pItemIDL);
    Result := FileExists(Dateiname);
  finally
    PIDLListe.Free;
  end
end;
Das ist immer noch komplex (aus Sicht eines pingeligen Softwarearchitekten), aber wenn Du soweit bist, kann man noch weiter am Code rumschrauben, damit er verständlicher wird. Ziel sollte es sein, den Code ohne Kommentare intuitiv zu verstehen.
Eins zum Schluss: Ich habe deutsche und englische Bezeichnernamen vermischt: Ganz großer Käse! Entscheide dich für eine Sprache und dann zieh das durch. Vermeide Abkürzungen, außer, sie entsprechen dem Fachjargon ('PIDL')

Geändert von Dejan Vu (27. Aug 2014 um 08:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz