Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi File Eraser programmieren (https://www.delphipraxis.net/59818-file-eraser-programmieren.html)

3_of_8 29. Dez 2005 15:00

Re: File Eraser programmieren
 
Aber man könnte doch die Festplatte von vorne bis hinten durchgehen und alle nicht verwendeten Sektoren überschreiben, oder?

Ultimator 29. Dez 2005 15:15

Re: File Eraser programmieren
 
Und was machst du mit den halbvollen Sektoren?
Außerdem sollen ja u.U. Datei"rückstände" anderer Dateien erhalten bleiben.Wenn du aber alles Andere löschst, sind die auch fort.

3_of_8 29. Dez 2005 15:24

Re: File Eraser programmieren
 
Na gut, ich gebs auf.

himitsu 29. Dez 2005 15:40

Re: File Eraser programmieren
 
Was mir gerade aufgefallen ist, das ich noch die Dateigröße beim Überschreiben zumindestens auf volle Sektoren aufrunden könnte, damit zumindestens die verwendeten Sektoren vollständig "leer" sind.

Micha88 3. Jan 2011 20:35

AW: Re: File Eraser programmieren
 
Zitat:

Zitat von himitsu (Beitrag 405557)
Da meine Variante eh mal als OpenSource auslaufen wird, kann ich dat hier ja ruhig mal zeigen ^^

Alao aktuell mach ich dat so:
Delphi-Quellcode:
Type TDelFlags = Set of (cdfOverride1, cdfOverride3, cdfOverride7, cdfOverride15, cdfOverride31,
  cdfSplit, cdfSplitLarge, cdfFileTable); // cdfFileTable do not use on Win NT file system.

Const cdfDefault = [cdfOverride7 {, cdfFileTable}];
  cdfDefaultLarge = [cdfOverride1, cdfSplitLarge {, cdfFileTable}];



Function ClearAndDeleteFile(FileName: WideString; Flags: TDelFlags = cdfDefault): ByteBool;
  Var Handle: THandle;
    Len, LF: TLargeIntRec;
    DecSize, BufSize, i, i2: LongInt;
    Buffer: PLongWordArray;

  Begin
    Result := False;
    FileName := _ExpandFileName(FileName);
    Handle := CreateFileW(Pointer(FileName), amGenericWrite or amGenericRead,
      amFileShareRead or amFileShareWrite or amFileShareDelete, nil, cdOpenExisting, 0, 0);
    If Handle = InvalidHandle Then Exit;
    Buffer := nil;
    Try
      Len.Lo := GetFileSize(Handle, @Len.Hi);
      If Len.Org = InvalidFileSizeLI Then Exit;
      If (Len.Hi = 0) and (Len.Lo <= $00A00000) Then BufSize := Len.Lo shr 2 Else BufSize := $00280000;
      Buffer := Memory.Get((BufSize + 1) shl 2);
      Memory.Fill1(Buffer, BufSize shl 2, LongWord(_Random(-1)));
      If cdfOverride31 in Flags Then i := 31 Else If cdfOverride15 in Flags Then i := 15
      Else If cdfOverride7 in Flags Then i := 7 Else If cdfOverride1 in Flags Then i := 1 Else i := 3;
      For i := i downto 0 do Begin
        For i2 := BufSize - 1 downto 0 do Buffer^[i2] := Buffer^[i2] xor LongWord(_Random(-1));
        i2 := BufSize shl 2 - _Random(BufSize);
        LF.Org := Len.Org;
        SetFilePointer(Handle, 0, nil, mmFileBegin);
        While LF.Org >= i2 do Begin
          WriteDataNE(Handle, Buffer, i2, nil, nil);
          Dec(LF.Org, i2);
        End;
        WriteDataNE(Handle, Buffer, LongInt(LF.Lo), nil, nil);
        FlushFileBuffers(Handle);
      End;
      If (cdfSplit in Flags) or (cdfSplitLarge in Flags) Then Begin
        DecSize := GetClusterSize(_ExtractFileDrive(FileName), 512);
        LF.Org := Len.Org;
        SetFilePointer(Handle, LF.Lo, @LF.Hi, mmFileBegin);
        If cdfSplitLarge in Flags Then Begin
          i := DecSize;
          While LF.Org > i do Begin
            Dec(LF.Org, i);
            SetFilePointer(Handle, -i, nil, mmFileCurrent);
            SetEndOfFile(Handle);
            FlushFileBuffers(Handle);
            i := DecSize + LF.Org shr 10;
          End
        End Else While LF.Org > DecSize do Begin
          Dec(LF.Org, DecSize);
          SetFilePointer(Handle, -DecSize, nil, mmFileCurrent);
          SetEndOfFile(Handle);
          FlushFileBuffers(Handle);
        End;
      End;
      SetFilePointer(Handle, 0, nil, mmFileBegin);
      SetEndOfFile(Handle);
    Finally
      Memory.Free(Pointer(Buffer));
      CloseHandle(Handle);
    End;
    DeleteFileW(Pointer(FileName));
    If cdfFileTable in Flags Then Begin
      For i := 0 to 99 do Begin
        FileName := WideString('CF') + WideChar(i div 10 or $30) + WideChar(i mod 10 or $30) + WideString('.FNSClearDir');
        Handle := CreateFileW(Pointer(FileName), amGenericWrite,
          amFileShareRead or amFileShareWrite or amFileShareDelete, nil, cdCreateAlways, 0, 0);
        If Handle <> InvalidHandle Then CloseHandle(Handle);
      End;
      For i := 99 downto 0 do Begin
        FileName := WideString('CF') + WideChar(i div 10 or $30) + WideChar(i mod 10 or $30) + WideString('.FNSClearDir');
        DeleteFileW(Pointer(FileName));
      End;
    End;
    Result := True;
  End;
Das meiste dürfte ja selbsterklärend sein, von den Namen her.
- WriteDataNE entspricht dabei WriteFile (WinAPI incl. 'ner winzigen Fehlerbehandling)
- Memory geht direkt an den MemoryManager in etwa kann man das so sehn: Memory.Get=GetMem, ...

Ein Problem hab ich allerdings noch beim entfernen der Daten aus dem Verzeichnis.
Bei den älteren Dateisystemen (FAT...) konnte man den Eintrag dadurch entfernen, daß man die Tabelle überfüllt hat.
Leider führt NTFS 'ne Art LogBuch, oder wie man das nennen kann, wo ich bisher noch nicht weiß, wie ich da rannkomme, um den entsprechenden Eintrag entfernen zu können -.-''


Na ja, mal sehn ob jemand noch ein paar Tipps hat :angel2:

Kann mir mal wer sagen, welche USES ich dafür alles einbinden muss??

Luckie 3. Jan 2011 20:39

AW: File Eraser programmieren
 
Wenn du uns sagst, welche Funktionen nicht erkannt werden...

Micha88 3. Jan 2011 20:42

AW: File Eraser programmieren
 
Funktionen werden generell garkeine in dieser "Function" erkannt.
Sowie TLargeIntRec und PLongWordArray werden nicht erkannt.

Matze 3. Jan 2011 20:47

AW: File Eraser programmieren
 
Das wird irgendwas eigenes sein wie z.B. das folgende, vermute ich.
Delphi-Quellcode:
type
  TLongWordArray = array of LongWord;

var
  LongWordArray: TLongWordArray;
Delphi-Quellcode:
type
  TLargeIntRect: record
    Hi: LargeInt; // gibt's LargeInt?
    Lo: LargeInt;
    Ord: LargeInt;
  end;
Oder so ähnlich.

Micha88 3. Jan 2011 20:49

AW: File Eraser programmieren
 
Wieso wird das dann nicht mit in den Post gepackt?
Sehr nett ...

Matze 3. Jan 2011 20:52

AW: File Eraser programmieren
 
Weil es himi vermutlich darum ging, das Vorgehen des Algorithmusses zu zeigen.
Da sind die genauen Typen weniger wichtig.

Wie ich himi und seine ganzen Open-Source-Klassen kenne, möchte er dir das keinesfalls vorenthalten.
Wenn du ihn lieb fragst, verrät er dir sicher, was genau hinter den Typen steckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.
Seite 3 von 4     123 4      

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