Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Alle Dateien in einem Ordner schrotten??? (https://www.delphipraxis.net/34788-alle-dateien-einem-ordner-schrotten.html)

mlspider 28. Nov 2004 13:54


Alle Dateien in einem Ordner schrotten???
 
Hallo,

Vorab sei gesagt, daß ich in diesem Forum schon jede menge Threads über das unwiderbringliche Löschen von Dateien gefunden habe. Aber wie funktioniert das "Schrotten" (also mit Müll überschreiben und danach endgültig löschen) mit allen Dateien in einem Ordner? Wenn es geht, ohne OpenDialog.

Danke

jim_raynor 28. Nov 2004 14:09

Re: Alle Dateien in einem Ordner schrotten???
 
Man nutzt die DP suche um nach FindFirst, FindNext und FindClose zu suchen um alle Dateien in einem Verzeichnis zu ermitteln.

nailor 28. Nov 2004 14:26

Re: Alle Dateien in einem Ordner schrotten???
 
am besten in der codelib nach der rekursiven variante.

mlspider 28. Nov 2004 14:27

Re: Alle Dateien in einem Ordner schrotten???
 
Danke

Jelly 28. Nov 2004 14:28

Re: Alle Dateien in einem Ordner schrotten???
 
Zitat:

Zitat von mlspider
Wenn es geht, ohne OpenDialog.

Und am besten noch ohne Nacgfragen beim User... :warn:

Also so Sachen blick ich immer sehr skeptisch entgegen und frag mich immer, was der Sinn von so Spielchen sein soll. :gruebel:

Aenogym 28. Nov 2004 14:48

Re: Alle Dateien in einem Ordner schrotten???
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von mlspider
Wenn es geht, ohne OpenDialog.

Und am besten noch ohne Nacgfragen beim User... :warn:

Also so Sachen blick ich immer sehr skeptisch entgegen und frag mich immer, was der Sinn von so Spielchen sein soll. :gruebel:

vielleicht programmiert er ja einen datei-schredder...

Aenogym

mlspider 28. Nov 2004 14:53

Re: Alle Dateien in einem Ordner schrotten???
 
Genau, bin nur nicht auf die Bezeichnung "Shredder" gekommen. Muß man denn immer gleich an böswillige Absichten denken??? Ich habe nicht vor, jemanden zu schädigen!!!

Ich suche lediglich eine Methode, wie man Dateien in einem Ordner, ohne jeweils eine Datei auswählen zu müssen, in einem Rutsch sicher und unwiederbringlich zu löschen.

mlspider 28. Nov 2004 17:33

Re: Alle Dateien in einem Ordner schrotten???
 
An alle den es interessiert. Ich habe das Problem mit einem Code-Schnipsel aus einen anderem Forum wie folgt gelöst:

Delphi-Quellcode:
function WipeFile(const szFilename: string): boolean;
var
  f     : file;
  buf   : array[0..65535]of byte;
  i,
  iRead,
  iWrite : integer;
  fpos  : longint;
begin
  {$I-}
  AssignFile(f,szFileName);
  ReSet(f,1);


  if(IoResult = 0) then begin
    repeat
      fPos := filepos(f);                   // aktuelle Position merken
      BlockRead(f,buf,sizeof(buf),iRead);   // max. 65k lesen

 
      // der tatsächlich gelesene Wert steckt in "iRead" und
      // ist irgendwann Null, wenn das Ende der Datei erreicht
      // wurde und keine Bytes mehr gelesen werden können
      if(iRead > 0) then
        // (alte?) Methode des DOD (US-Verteidigungsministerium):
        // einmal 00 schreiben; einmal FF schreiben (3 Wiederholungen)
        // dann F6 schreiben
        // (Norton WipeInfo macht´s heute noch so; außer, das 0x01
        // anstelle von 0xff angegeben ist)
        for i := 1 to 7 do begin
          case i of
            1,3,5 : fillchar(buf,iRead, 0); // Inhalt mit 0x00 überschreiben
            2,4,6 : fillchar(buf,iRead,255); // Inhalt mit 0xff überschreiben
            7     : fillchar(buf,iRead,246); // Inhalt mit 0xf6 überschreiben
          end;


          seek(f,fPos);                     // gespeicherte Position suchen
          BlockWrite(f,buf,iRead,iWrite);   // Puffer schreiben
          if(iWrite <> iRead) then break;   // Fehler! :o(
        end;
    until(iRead = 0) or (iWrite <> iRead);

 
    CloseFile(f);                           // alte Datei schließen
    Rename(f,'D');                          // alten Namen "vernichten"
    ReWrite(f,1);                           // alte Position "vernichten"
    CloseFile(f);
    Erase(f);                               // Datei löschen
  end;
  {$I+}

 
  Result := (IoResult = 0);
end;

 
Procedure DeleteFiles(aPath, aFindMask: String; aWithSub: Boolean);
Var
  FindRec: tSearchRec;
Begin
  // Wenn aPath oder aFind nicht angegeben ist
  // dann raus
  If (aPath = '') or (aFindMask = '') Then
    Exit;


  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  If aPath[Length (aPath)] <> '\' Then
    aPath := aPath + '\';

 
  // Im aktuellen Verzeichnis nach der Datei suchen
  If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // ...Ergebnis löschen
        WipeFile(aPath + FindRec.Name);
    Until FindNext (FindRec) <> 0;

 
  FindClose (FindRec);

 
  // Wenn nicht in Unterverzeichnissen gesucht werden soll dann raus
  If Not aWithSub Then
    Exit;

 
  // In Unterverzeichnissen weiter suchen
  If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then
    Repeat
      If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then
        // Feststellen, ob es sich um ein Verzeichnis handelt
        If Boolean (FindRec.Attr and faDirectory) Then
          // Funktion erneut aufrufen, um Verzeichnis zu durchsuchen (Rekursion)
          DeleteFiles (aPath + FindRec.Name, aFindMask, aWithSub);
    Until FindNext (FindRec) <> 0;


   FindClose (FindRec);
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
 DeleteFiles ('j:\test', '*.*', True);
end;
Wobei J:\Test für mein Versuchs-Ordner stand.

getestet! Es funktioniert! Das einzigste was mich daran noch stört, das die leeren Ordner erhalten bleiben. Aber vielleicht gibt es hierfür auch noch eine Lösung.

MathiasSimmack 28. Nov 2004 18:12

Re: Alle Dateien in einem Ordner schrotten???
 
In welchem Forum hättest du denn die Lösung? Hier oder im DF? ;)

Wenn dich die leeren Ordner stören, dann solltest du sie löschen. Sie sind ja leer. Als Tipp: Erst den Ordner löschen, dann eine temporäre Datei mit dem gleichen Namen erzeugen, selbige umbenennen, damit sie nur noch aus einem Zeichen besteht, und dann löschen. :)

Oder den Ordner umbenennen, damit er nur noch aus einem Zeichen besteht, und dann löschen.

mlspider 28. Nov 2004 18:17

Re: Alle Dateien in einem Ordner schrotten???
 
Genau dieses Forum. Und wenn mich nicht alles täuscht, ist der Code sogar von Dir! Allerdings kann ich Deinen Tip nicht nach vollziehen.

MathiasSimmack 28. Nov 2004 18:29

Re: Alle Dateien in einem Ordner schrotten???
 
Zum Ordner löschen verweise ich dich mal an die zahlreichen [dp="Ordner löschen"]Suchergebnisse[/dp].

Ansonsten war der Tipp hauptsächlich für FAT-Partitionen gedacht. Wenn du Dateien normal löscht, dann werden sie als gelöscht markiert, und der erste Buchstabe des Namens wird überschrieben. Undelete-Tools können das wieder rückgängig machen und die Datei "wiederherstellen". Wenn du die Datei shredderst, dann ist der Inhalt weg, aber anhand des Namens könnte man immer noch Rückschlüsse auf den Inhalt ziehen. Darum auch die letzten Zeilen der "WipeFile"-Prozedur:
Delphi-Quellcode:
    CloseFile(f);                           // alte Datei schließen
    Rename(f,'D');                          // alten Namen "vernichten"
    ReWrite(f,1);                           // alte Position "vernichten"
    CloseFile(f);
    Erase(f);                               // Datei löschen
Hier wird die Datei (egal welchen Namen sie trägt), in "D" umbenannt. Auf die Weise verschwindet auch gleich der lange Dateiname von 9x. Dann kann die Datei gelöscht werden. Wie gehabt, wird dabei der erste Buchstabe überschrieben. Und weil der Dateiname ja nur noch aus einem Buchstaben bestand, wird genau der überschrieben, und keiner weiß mehr, welchen Namen die Datei mal hatte. Das gleiche kannst du auch mit einem Ordner machen, da auch der Ordner einen Eintrag in der FAT hat.

Inwieweit das für NTFS zutrifft, kann ich dir im Augenblick nicht sagen. Ich habe schon lange nichts mehr geshreddert, und die Prozedur ist ja auch schon ein bisschen älter. ;)

mlspider 28. Nov 2004 18:39

Re: Alle Dateien in einem Ordner schrotten???
 
Mein Datei-System ist NTFS. Und ich muß sagen, Dein Beispiel funktioniert wunderbar!!! Ich habe versucht die Dateien mit mehreren Recovery-Tools (so heißen die Tools wohl) zurück zu holen. Es hat nicht ein einziges geschafft, auch nur ansatzweise meine geschredderten Dateien zu finden, geschweige wieder her zu stellen! Der Code ist nach wie vor aktuell. Und ich denke, der gehört auch in die Code-Library!!!

Das mit den leeren Verzeichnissen hat eigentlich keine Eile. Irgendwie kann man das ja auch ableiten. Hast Du ja auch sehr gut erklärt!

Jetzt bin ich hinter gestiegen und kann Dein Beispiel nachvollziehen!!!

Manchmal dauert es bei mir etwas länger!!! Sorry!!!

supermuckl 28. Nov 2004 21:24

Re: Alle Dateien in einem Ordner schrotten???
 
ich will ja nich die freude trügen, aber ein unwiederherstellbares löschen ist das überhaupt nicht.

files werden nur einmal überschrieben
und das mit dem dateinamen auch nur einmal durchgeführt
ausserdem sind noch andere kleinigkeiten bedenklich

fkerber 28. Nov 2004 21:27

Re: Alle Dateien in einem Ordner schrotten???
 
Hi!

Soweit ich das sehe, wird 7x überschrieben (For-Schleife).
Was ist denn noch "bedenklich"?

Außerdem ließ sich ja bis jetzt nix wiederherstellen, oder?


Ciao Frederic

supermuckl 28. Nov 2004 21:35

Re: Alle Dateien in einem Ordner schrotten???
 
naja von 20x war schonmal die rede und der dateiname wird nur einmal umbenannt :gruebel:

mlspider 28. Nov 2004 22:06

Re: Alle Dateien in einem Ordner schrotten???
 
Wie gesagt. Die gelöschten Dateien lassen sich nicht mehr herstellen!!!

Wo sind die Bedenken?

Luckie 28. Nov 2004 22:07

Re: Alle Dateien in einem Ordner schrotten???
 
Bring die Festpaltte mal zu einer Datenrettungsfirma und du wirst dich wundern, was die noch alles wiederherstellen könne. ;)

mlspider 28. Nov 2004 22:11

Re: Alle Dateien in einem Ordner schrotten???
 
Schon richtig!!! Um Daten richtig zu vernichten, wäre wohl ein richtiger Magnet das beste!!!! Für meine Anwendung soll aber dies reichen!!!

supermuckl 28. Nov 2004 23:37

Re: Alle Dateien in einem Ordner schrotten???
 
ein richtiger magnet ist der schreibkopf aber auch :) und je öfter er die bits umdreht desto eher kann man nix wiederherstellen OHNE die festplatte komplett zu vernichten ;)

MathiasSimmack 29. Nov 2004 08:24

Re: Alle Dateien in einem Ordner schrotten???
 
Zitat:

Zitat von supermuckl
naja von 20x war schonmal die rede [...]

Es steht dir frei, eine weitere Schleife drum herum zu bauen, die meinetwegen 20x aufgerufen wird, und in der dann der 7x Überschreibprozess stattfindet.

Zitat:

und der dateiname wird nur einmal umbenannt :gruebel:
Reicht doch. Wie gesagt, es ist nur ein einziger Buchstabe, und da bei FAT genau der erste Buchstabe entfernt wird, weiß keiner mehr, wie die Datei ursprünglich mal hieß. Zumal sie ohnehin vorher noch mal neu erzeugt wird, womit die Verweise auf die ursprüngliche Position der ursprünglichen Datei auch noch verloren gehen.

null.L.F. 8. Mär 2005 09:18

Re: Alle Dateien in einem Ordner schrotten???
 
[edit] grmbl.. erst lesen, dann posten [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz