Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 35 Mal überschreiben (https://www.delphipraxis.net/26802-35-mal-ueberschreiben.html)

HW764 29. Jul 2004 16:08


35 Mal überschreiben
 
Ich habe diesen Code, der eine Datei 6 mal überschreibt.
Nun will ich, dass er diese Datei 35 Mal überschreibt.
Was muss ich ändern? (Beim Pfeil "Hier")

Delphi-Quellcode:
procedure EraseFile(Filename: string);
const
  Buffer = 1024;
  FillBuffer: array[0..5] of Integer = ($00, $FF, $00, $F0, $0F, $00); //<-- Hier
var
  arr: array[1..Buffer] of byte;
  f: file;
  i, j, n: integer;
begin
  AssignFile(f, FileName);
  Reset(f, 1);
  n := FileSize(f);
  for j := 0 to 5 do
  begin
    for i := 1 to n div Buffer do
    begin
      BlockWrite(f, FillBuffer[j], Buffer);
    end;
  end;
  CloseFile(f);
  RenameFile(Filename, ExtractFilepath(Filename)+'$000000.tmp');
  DeleteFile(ExtractFilepath(Filename)+'$000000.tmp');
end;

Matze 29. Jul 2004 16:14

Re: 35 Mal überschreiben
 
Ich denke, du musst überall die "5" durch die "34" ersetzen. Bin mir aber nicht sicher.

Edit: Zu der Klammer: Weißt du, was die einzelnen Werte bedeuten?

StefanDP 29. Jul 2004 16:17

Re: 35 Mal überschreiben
 
"FillBuffer" wird "das" sein, was nacheinander über die datei geschrieben wird!
mach einfach was in der art
Code:
  FillBuffer: array[0..35] of Integer = ($00, $FF, $00, $F0, $0F, $00, $FF, $00, $F0, $0F, $00, $FF, $00, $F0, $0F, $00, $FF, $00, $F0, $0F, $00...)
draus
oder lass dein fillbuffer und änder deine schleife in etwas wie ungefähr:
Delphi-Quellcode:
  for j := 0 to 35 do
  begin
    for i := 1 to n div Buffer do
    begin
      BlockWrite(f, FillBuffer[j mod 5], Buffer);
    end;
  end;
vom prinzip her halt, nicht getestet

stefan

flomei 29. Jul 2004 16:17

Re: 35 Mal überschreiben
 
Das was in der Klammer steht ist doch der "Fill Buffer".
Ist also nur das womit überschrieben wird, oder?!?

Wenn überhaupt, dann würde ich das wie Matze schon sagt die 5 in der for-Schleife durch eine 35 ersetzen. Das ist ja ne Zählervariable die angibt wie oft überschrieben wird...

MfG Florian :hi:

[edit] Oh... derbe zu spät... [/edit]

Spezi1980 29. Jul 2004 16:18

Re: 35 Mal überschreiben
 
Bitte:

Delphi-Quellcode:
procedure EraseFile(Filename: string);
const
  Buffer = 1024;
  Counttowrite = 34;
  FillBuffer: array[0..5] of Integer = ($00, $FF, $00, $F0, $0F, $00); //<-- Hier
var
  arr: array[1..Buffer] of byte;
  f: file;
  i, j, n: integer;
begin
  AssignFile(f, FileName);
  Reset(f, 1);
  n := FileSize(f);
  for j := 0 to Counttowrite do
  begin
    for i := 1 to n div Buffer do
    begin
      BlockWrite(f, FillBuffer[j], Buffer);
    end;
  end;
  CloseFile(f);
  RenameFile(Filename, ExtractFilepath(Filename)+'$000000.tmp');
  DeleteFile(ExtractFilepath(Filename)+'$000000.tmp');
end;
Die Konstante "Counttowrite" gibt an wieviel mal du das überschreiben willst.

[OT] war wohl etwas zu langsam [/OT]

HW764 29. Jul 2004 16:38

Re: 35 Mal überschreiben
 
Was muss ich jetzt an deinem Code ändern, wenn ich es 35 mal
überschreiben will?
Etwa so???

Delphi-Quellcode:
procedure EraseFile(Filename: string);
const
  Buffer = 1024;
  Counttowrite = 34;
  FillBuffer: array[0..5] of Integer = ($00, $FF, $00, $F0, $0F, $00)
var
  arr: array[1..Buffer] of byte;
  f: file;
  i, j, n: integer;
begin
  AssignFile(f, FileName);
  Reset(f, 1);
  n := FileSize(f);
  for j := 35 to Counttowrite do //<-- Hier
  begin
    for i := 1 to n div Buffer do
    begin
      BlockWrite(f, FillBuffer[j], Buffer);
    end;
  end;
  CloseFile(f);
  RenameFile(Filename, ExtractFilepath(Filename)+'$000000.tmp');
  DeleteFile(ExtractFilepath(Filename)+'$000000.tmp');
end;

shmia 29. Jul 2004 17:00

Re: 35 Mal überschreiben
 
Zitat:

Zitat von HW764
Ich habe diesen Code, der eine Datei 6 mal überschreibt.

Der Code ist Kot. :cyclops:
Denn BlockWrite ist eine gepufferte Funktion; es ist nicht sicher, dass die Daten jemals alle auf die Platte kommen.
35-faches Überschreiben ist übertrieben; am Besten man füllt die Datei zum Schluss mit
zufälligen Schrottdaten, dann versagt jedes Partial Response Verfahren.

Hier ist mein Gegenvorschlag:
Delphi-Quellcode:
procedure ShredderFile(const filename:string);
const
  Fillchars: array[0..5] of char = (Char($00), Char($FF), Char($00), Char($F0), Char($0F), Char($00));
  BLOCK_SIZE = 8096;
var
   fs : TFileStream;
   buffer : String;
   i, j : Integer;
begin
   fs := TFileStream.Create(filename, fmOpenReadWrite or fmShareExclusive);
   try
      // Datei auf nächste Blockgrösse verlängern, damit der "Slack" überschrieben
      // wird
      fs.Size := ((fs.Size div BLOCK_SIZE) +2) * BLOCK_SIZE;

      // Datei soll mindestens 2 MB gross sein, damit die Schreibcaches der
      // Festplatten überflutet werden
      if fs.Size < 2097152 then
         fs.Size := 2097152;


      for i := 0 to 5 do
      begin
         fs.Position := 0;
         buffer := StringofChar(Fillchars[i], BLOCK_SIZE);

         for j := 1 to fs.Size div BLOCK_SIZE do
         begin
            fs.WriteBuffer(buffer[1], BLOCK_SIZE);
         end;
         FlushFileBuffers(fs.Handle);
      end;

      // wir verarschen den Geheimdienst und schreiben zum Schluss
      // seltsame Schrottdaten
      // wirkliche Zufallsdaten wären besser, aber das reicht doch auch schon
      buffer := 'Terror, Bin Laden, Sprengstoff, Waffen, Plutonium';
      fs.Position := 0;
      for j := 1 to fs.Size div Length(buffer) do
      begin
         fs.WriteBuffer(buffer[1], Length(buffer));
      end;
   finally
      fs.Free;
   end;
end;


procedure ShredderAndDeleteFile(const filename:string);
var
   newname : string;
begin
   // zuerst umbennen, dann später keine Rückschlüsse auf den Dateinamen möglich sind
   newname := ExtractFilepath(Filename)+'$000000.tmp';

   if not RenameFile(Filename, newname) then
      raise Exception.CreateFmt('Can''t rename file %s', [filename]);

   ShredderFile(newname);

   DeleteFile(newname);
end;

Matze 29. Jul 2004 17:01

Re: 35 Mal überschreiben
 
Ne, also bissle überlegen solltest du schon:

Delphi-Quellcode:
for j := 35 to Counttowrite do
Counttowrite hat den Wert 34.

Somit kann die for-Schleife gar nicht durchlaufen werden.
Du kannst den Code von Spezi1980 1:1 übernehmen.

HW764 29. Jul 2004 17:23

Re: 35 Mal überschreiben
 
LOL

Delphi-Quellcode:
   // wir verarschen den Geheimdienst und schreiben zum Schluss
      // seltsame Schrottdaten
      // wirkliche Zufallsdaten wären besser, aber das reicht doch auch schon
      buffer := 'Terror, Bin Laden, Sprengstoff, Waffen, Plutonium';
Aber er Code geht supa! Vielen Dank!

rantanplan99 29. Jul 2004 18:10

Re: 35 Mal überschreiben
 
Verscht ihr den HW764 oder verarscht der uns?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 1 von 3  1 23      

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