Autor Beitrag
Biarchiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Do 11.12.08 15:24 
Hallo,

wir würdet Ihr größere Dateien (50 - 600MB) mit lauter 00h schreiben lassen?

Mit diesem Code kann man ja bei Offset einen bestimmten HEX ändern lassen.
Arbeitet der mit größeren Datein als 4GB auch zusammen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure ReplaceAtOffset(Filename: string; Offset: Integer; B: Byte); 
var 
  F: file of Byte; 
begin 
  AssignFile(F, Filename); 
  FileMode := fmOpenReadWrite; 
  Reset(F); 
  Seek(F, Offset); 
  BlockWrite(F, B, 1); 
  CloseFile(F); 
end;

ReplaceAtOffset('c:\file'$0099999$00);
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 11.12.08 15:49 
Ich hab's gerade mal getestet, weil ich's nicht glauben konnte, aber der Code von mir (den du da nutzt), kann das tatsächlich.

Gib ihm einfach ein Offset an, dass groß genug ist, z.B. $40000000 für 1GB (bzw. halt $100000000 für 4GB) und lass ihn dort $00 hinschreiben. Windows vergrößert die Datei dann automatisch auf den angegebenen Wert.

Funktioniert (bei mir) aber nur bis 1215752193 Byte, also 1,13GB.
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Do 11.12.08 16:09 
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab's gerade mal getestet, weil ich's nicht glauben konnte, aber der Code von mir (den du da nutzt), kann das tatsächlich.

Gib ihm einfach ein Offset an, dass groß genug ist, z.B. $40000000 für 1GB (bzw. halt $100000000 für 4GB) und lass ihn dort $00 hinschreiben. Windows vergrößert die Datei dann automatisch auf den angegebenen Wert.

Funktioniert (bei mir) aber nur bis 1215752193 Byte, also 1,13GB.


Hallo,

wieso, darf man die Codes in diesem Forum nicht verwenden?

Andere Frage wenn man $FFFFFFFF angiebt, erstellt man die Stelle 4294967295.
Ginge es noch größer oder kann dieser code größere Dateien schon bearbeiten aber
nicht weiter als 4294967295 rausspringen?
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 11.12.08 16:26 
user profile iconBiarchiv hat folgendes geschrieben Zum zitierten Posting springen:
wieso, darf man die Codes in diesem Forum nicht verwenden?

Hab' ich nicht behauptet. ;)
Nur sollte man den Code aus irgendwelchen Quellen nicht ungefiltert übernehmen, denn wie ich in dem anderen Thread bereits angemerkt habe, ist dieser Code-Schnippsel gänzlich ohne Fehlerbehandlung. Wenn also was schief läuft, kann quasi alles passieren. :)

user profile iconBiarchiv hat folgendes geschrieben Zum zitierten Posting springen:
Andere Frage wenn man $FFFFFFFF angiebt, erstellt man die Stelle 4294967295.
Ginge es noch größer oder kann dieser code größere Dateien schon bearbeiten aber
nicht weiter als 4294967295 rausspringen?

Wie gesagt, mehr als die 1,13GB konnte ich bei mir nicht erzeugen, ich vermute also, dass Seek nur bis dahin kommt. Dann sollte man vermutlich besser eine Stream-Variante nehmen, aber warum der Code bei 1,13GB aussteigt, kann ich dir so nicht sagen.
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Do 11.12.08 18:09 
Hallo,

vielen Dank. Vielleicht geht es mit älteren Delphi-Versionen nicht?

Kann man bei diesem Code auch mehrere Bytes infolge schreiben?
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Fr 12.12.08 10:39 
Generell ja, das Blockwrite übernimmt das schreiben.

Es geht natürlich folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
ReplaceAtOffset('c:\test'$100$FF);
ReplaceAtOffset('c:\test'$101$FF);
ReplaceAtOffset('c:\test'$102$FF);

Allerdings ist das ziemlich langsam, da er jedes Mal die Seek-Operation durchführen muss, die vom Dateianfang sucht.
Also lieber nur 1 Seek und dann mehrere BlockWrite-Aufrufe, das kann die Prozedur natürlich nicht.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.02.14 00:56 
Aktualisierung:

NTFS-HDD:

ReplaceAtOffset('D:\test.txt', $7FFFFFFF, $00); // 2 GB geht!!! $80000000 - oder größer: geht nicht!!!


Wer schnell einen Platz auf der HDD von z.B. 10 GB beschreiben / belegen will, kann folgenden Code benutzen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure ReplaceAtOffset(Filename: string; Offset: Integer; B: Byte);
var F: file of Byte;
begin
  AssignFile(F, Filename);  
  Rewrite(F);
  FileMode := fmOpenReadWrite;
  Reset(F);
  Seek(F, Offset);
  BlockWrite(F, B, 1);
  CloseFile(F);
  Winapi.Windows.Beep(1600,100);
end;

procedure TForm2.Button10Click(Sender: TObject);
var i:Integer; fn : String;
begin
for I := 1 to 10 do  // schreibt 10 Files mit je 1 GB
Begin
fn:= 'D:\test-'+INTTOSTR(i)+'.txt';
ReplaceAtOffset(fn, $40000000$00);  //1 GB 
end;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 12.02.14 01:06 
Am einfachsten dürfte eine MMF sein um die ganze Datei mit Nullzeichen zu überschreiben, z.B. mit dem FastFileStream. Denn wenn man nur die Dateigröße auf einen bestimmten Wert setzt, wird der Inhalt logischerweise dabei nicht initialisiert.