Ich bin dabei, mir eine Prozedur zum Dateischreddern zu schreiben.
Bei kurzen Dateien funktioniert das auch einwandfrei.
Aber bei langen Dateien bricht das Programm direkt nach der Prozedur ab.
Delphi-Quellcode:
type
TFileData = array[DWord] of Byte;
TAnyFile = file of byte;
...
procedure shred(fn:string);
var data: TFileData; l: DWord; f: TAnyFile;
procedure ReadBytes;
var i: DWord;
begin
System.Reset(f);
i := Low(i);
while not (eof(f) or (i=High(i))) do begin System.Read(f,Data[i]); Inc(i); end;
l := i; ShowMessage(IntToStr(l));
i := Low(i);
System.Close(f);
end;
procedure StoreBytes;
var i: DWord;
begin
System.Reset(f);
for i := Low(i) to l do System.Write(f,Data[i]);
System.Close(f);
end;
procedure Pass1;
var i: DWord;
begin
for i := Low(i) to l do Data[i] := Data[i] or $B4;
end;
procedure Pass2;
var i: DWord;
begin
for i := Low(i) to l do Data[i] := Data[i] and $2D;
end;
procedure Pass3;
var i: DWord;
begin
for i := Low(i) to l do Data[i] := Data[i] xor $67;
end;
procedure Pass4;
var i: DWord;
begin
for i := Low(i) to l do Data[i] := Data[i] or $ED;
end;
begin
ShowMessage('0');
ChDir(DirToWin(dir));
ShowMessage('1');
System.Assign(f,fn);
ShowMessage('2');
ReadBytes;
ShowMessage('3');
{ Pass1;StoreBytes;
ShowMessage('4');
Pass2;StoreBytes;
ShowMessage('5');
Pass3;StoreBytes;
ShowMessage('6');
Pass4;StoreBytes;
ShowMessage('7'); }
end;
Durch auskommentieren (siehe oben) habe ich herausgefunden, dass allein schon das Lesen (ReadBytes) für den Abbruch verantwortlich ist.
Auch den Aufruf habe ich durch ShowMessage-Aufrufe gepolstert, daher weiß ich, dass direkt nach Aufruf der Prozedur abgebrochen wird:
Delphi-Quellcode:
ShowMessage('-1');
shred(p[1]);
// Hier wird abgebrochen
ShowMessage('8');
Warum bricht das Programm bei langen Dateien ab und bei kurzen nicht?