Entwickler-Ecke
Dateizugriff - Große Datei mit "00h" schnell schreiben lassen
Biarchiv - Do 11.12.08 15:24
Titel: Große Datei mit "00h" schnell schreiben lassen
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?
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 - 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 - Do 11.12.08 16:09
baka0815 hat folgendes geschrieben : |
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 - Do 11.12.08 16:26
Biarchiv hat folgendes geschrieben : |
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. :)
Biarchiv hat folgendes geschrieben : |
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 - 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 - Fr 12.12.08 10:39
Generell ja, das Blockwrite übernimmt das schreiben.
Es geht natürlich folgendes:
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.
Delete - 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:
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 Begin fn:= 'D:\test-'+INTTOSTR(i)+'.txt'; ReplaceAtOffset(fn, $40000000, $00); end; end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!