![]() |
blockwrite sehr sehr große datei.
hallo
ich mach grad folgendes:
Delphi-Quellcode:
was ich machen will ist klar:
var
Form1: TForm1; Num : Array of byte; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var dat : file; lokal : integer; begin AssignFile(dat,'I:\delphi\testContainer\test1.dat'); rewrite(dat); for lokal:=0 to 127 do Blockwrite(dat,num[0],1); closefile(dat); end; procedure TForm1.FormCreate(Sender: TObject); var lokal : integer; begin SetLength(Num,128); for lokal:=0 to 127 do begin num[lokal]:=lokal; end; end; ich will das dynamische array am anfang mit den werten 0 bis 127 füllen, und dann den 1. wert 128 mal abspeichern. soweit so gut. klappt auch ohne error. doch nun will ich nicht immer nur den ersten sondern alle werte abspeichern. dazu habe ich
Delphi-Quellcode:
ausprobiert.
for lokal:=0 to 127 do Blockwrite(dat,num[lokal],1);
doch nun bekomme ich den E/A-Feherl 1784. was soll den dass? das array ist lang genug und eigendlich sollte es nix zu meckern geben. Btw: bei der 1. variante habe ich gemerkt, dass die datei, welche eigendlich grad mal 128byte groß sein sollte auf 14KB anwächst. nachdem ich mir die sache mit einem Hex-Viewer angeguggt habe stellte ich fest, dass 128byte packete mehrmals hintereinander in die datei geschrieben wurden. Weis jemand weiter? gruß snow |
Re: blockwrite sehr sehr große datei.
Wenn du byteweise schreibst müsste da glaub ich ein "rewrite(dat,1)" stehen
|
Re: blockwrite sehr sehr große datei.
Delphi-Quellcode:
Da steht aber ein SetLength von 128. Reicht das ? :zwinker:
Der ganze übertragene Block belegt höchstens Count * RecSize Bytes. RecSize ist die beim Öffnen der Datei angegebene Blockgröße (oder 128, falls keine Größe angegeben wurde).
|
Re: blockwrite sehr sehr große datei.
Rewrite(..., 1); ist per Standard definiert, also wäre es egel,
aber sicher, daß du genau for lokal:=0 to 127 do Blockwrite(dat,num[lokal],1); geschrieben hast oder steht im Programm etwas anderes? Du könntest es ja mal so versuchen, auch wenn ich nicht wüßte was dieses ändern sollte :gruebel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var dat : file of byte; lokal : integer; begin AssignFile(dat,'I:\delphi\testContainer\test1.dat'); rewrite(dat); for lokal:=0 to 127 do Blockwrite(dat,num[lokal],1); closefile(dat); end;
Delphi-Quellcode:
Blos mal aus Interesse: was/wo ist denn da eine sehr große Datei?
procedure TForm1.Button1Click(Sender: TObject);
var dat : file of byte; lokal : integer; begin AssignFile(dat,'I:\delphi\testContainer\test1.dat'); rewrite(dat); Blockwrite(dat,num[0],128); closefile(dat); end; (sehr groß fängt für mich so bei GB an) |
Re: blockwrite sehr sehr große datei.
Zitat:
|
Re: blockwrite sehr sehr große datei.
hab den Post gesehn :zwinker:
Delphi-Quellcode:
da hier keine Größe angegeben ist, wird per Default 1 verwendet.
var dat : file;
Code:
aber hier ist es per Default SizeOf(type)
var dat : file of [color=#ff0000]type[/color];
Delphi-Quellcode:
also "nur" so wären es 128
type TNum : Array[0..127] of byte;
var dat : file of TNum; [edit]grad getestet
Delphi-Quellcode:
function GetFileSize: Integer;
var F: File of Byte; begin AssignFile(F, 'test1.dat'); Reset(F); Result := FileSize(F); CloseFile(F); end; type TTest = array[0..31] of Byte; PFileRec = ^TFileRec; var F1: File; F2: TextFile; F3: File of TTest; F4: File of Byte; F5: File; i, i1, i2, i3, i4, i5: Integer; l1a, l3a, l4a, l5a: Integer; l1b, l4b, l5b: Integer; Num: Array of Byte; begin SetLength(Num, 32); //AssignFile(F1, 'test1.dat'); //Rewrite(F1); // i1 := PFileRec(@F1)^.RecSize; //CloseFile(F1); AssignFile(F1, 'test1.dat'); Rewrite(F1); i1 := PFileRec(@F1)^.RecSize; Blockwrite(F1, num[0], 1{32? o.O}); CloseFile(F1); l1a := GetFileSize; Rewrite(F1); for i := 0 to 31 do Blockwrite(F1, num[i], 1); CloseFile(F1); l1b := GetFileSize; //AssignFile(F2, 'test1.dat'); //Rewrite(F2); // i2 := PTextRec(@F2)^.RecSize; //CloseFile(F2); AssignFile(F2, 'test1.dat'); Rewrite(F2); i2 := PFileRec(@F2)^.RecSize; //i2 := PTextRec(@F2)^.RecSize; CloseFile(F2); //AssignFile(F3, 'test1.dat'); //Rewrite(F3); // i3 := PFileRec(@F3)^.RecSize; //CloseFile(F3); AssignFile(F3, 'test1.dat'); Rewrite(F3); i3 := PFileRec(@F3)^.RecSize; Blockwrite(F3, num[0], 1{1*TTest}); CloseFile(F3); l3a := GetFileSize; //AssignFile(F4, 'test1.dat'); //Rewrite(F4); // i4 := PFileRec(@F4)^.RecSize; //CloseFile(F4); AssignFile(F4, 'test1.dat'); Rewrite(F4); i4 := PFileRec(@F4)^.RecSize; Blockwrite(F4, num[0], 32); CloseFile(F4); l4a := GetFileSize; Rewrite(F4); for i := 0 to 31 do Blockwrite(F4, num[i], 1); CloseFile(F4); l4b := GetFileSize; //AssignFile(F5, 'test1.dat'); //Rewrite(F5); // i5 := PFileRec(@F5)^.RecSize; //CloseFile(F5); AssignFile(F5, 'test1.dat'); Rewrite(F5, 1); i5 := PFileRec(@F5)^.RecSize; Blockwrite(F5, num[0], 32); CloseFile(F5); l5a := GetFileSize; Rewrite(F5, 1); for i := 0 to 31 do Blockwrite(F5, num[i], 1); CloseFile(F5); l5b := GetFileSize; Application.MessageBox(PChar(Format( 'F1: File = %d > %d %d'#13#10 + 'F2: TextFile = %d > - -'#13#10 + 'F3: File of TTest = %d > %d -'#13#10 + 'F4: File of Byte = %d > %d %d'#13#10 + 'F5: File(1) = %d > %d %d', [i1, l1a, l1b, i2, i3, l3a, i4, l4a, l4b, i5, l5a, l5b])), ''); end; Zitat:
aber, egal wie es da aussieht, sollte doch BlockWrite dennoch nur das schreiben, was man angegeben hat? :gruebel: (kein Wunder daß ich da lieber mit der WinAPI arbeite) nja, mal wieder eines der Probleme an den alten Pascal-Funktionen. PS: es wird wohl nicht ohne Grund von "allen" empfohlen diese nicht mehr zu verwenden. (viele empfehlen TFileStream und andere wenden sich direkt an Windows) Aber meine Vermutung/Erklärung warum es 128 sind: es liegt nicht an dem 128 Byte großem Array, dann davon weiß AssignFile definitiv überhaupt nichts. die 128 kommen wohl daher, daß Delphi File indirekt wie TextFile mit einem Puffer ausstattet ist, welcher nunmal "rein zufällig" eine Größe von 128 Byte hat.
Delphi-Quellcode:
(drum hab ich bei obrigem Code/Test 32 Byte und nicht 128 verwendet, damit man den Unterschied sieht)
TTextBuf = array[0..127] of Char;
hab's aber grad selber nochma in der OH gefunden :shock: Zitat:
|
Re: blockwrite sehr sehr große datei.
Der Fehler muss woanders liegen, denn das hier funktioniert:
Delphi-Quellcode:
Var
dat: File; lokal: integer; Num : Array of byte; Begin AssignFile(dat, 'C:\test1.dat'); rewrite(dat); SEtLength (Num,128); For lokal := 0 To 127 Do Blockwrite(dat, num[lokal], 1); closefile(dat); End; Zitat:
Soweit ich das beurteilen kann, stammen die 128 Bytes von der Sektorgröße damaliger Speicher (Tontafeln oder ? :gruebel: ). Das waren nun mal 'Blöcke' und mit diesem Superbefehl konnte man direkt auf die Tontafeln a.k.a. Floppies/Bänder schreiben! Also *hardwarenah* und supersauschnell! :zwinker: Ich glaube, der Fragesteller hat uns noch nicht Alles verraten. @snow: Reduziere dein Projekt mal auf die relevanten und fehlerhaften Zeilen und stelle es hier rein. |
Re: blockwrite sehr sehr große datei.
Das BlockWrite, AssignFile und Co. sowas von uralt sind, seh ich schon ein
und nicht die 128 Byte "Cache" hab ich als Fehler angesehn, sondern die tatsache daß bei Nichtangabe einer Größe diese 128 genommen werden. Wenn nichts angegeben wird und Delphi oder damals Pascal dann eine 1 nehmen würden, dann würden solche Fehler hier nicht auftreten. Zitat:
Wie es schon Vorgeschlagen wurde, muß er also nur bei Reset/Rewrite die 1 angeben oder mit File of Byte arbeiten ... also F4 oder F5. und schon geht's. Oder er steigt einfach auf FileStream's um (mit der WinAPI muß er sich ja nicht unbedingt überfordern :angel2: ). Ich hatte (als ich noch diese Funktionen nutzte) wohl einfach nur Glück, da ich nie mit "File" arbeitete und dafür zufällig nur typisierte Dateien (File of) und Textdateien (TextFile) nutzte. |
Re: blockwrite sehr sehr große datei.
Ahoi himitsu san,
Das Zitat:
Ansonsten gilt wie immer (nicht für Dich): RTFM. Fehler dieser Art macht man genau deswegen, weil man eben nicht TFM liest. Ich habe BlockRead/Write ausschließlich für Dateikopierfunktionen verwendet (und als ich einmal eine kleine DB geschrieben habe). Zitat:
|
Re: blockwrite sehr sehr große datei.
Zitat:
32 ... nja, er hat eine 128 Byte-Array und das ist rein zufällig genausogroß wie der Datei-Puffer. also nahm ich einfach irgendeinen anderen Wert (32 is doch 'ne nette Zahl :love: ), damit man nicht mit den 128-Byte des Puffers und den 128 Byte des Arrays durcheinander kommt. denn wie soll man denn da wissen wovon die gemessenen 128 Byte nun stammen (Puffer oder Array). [s] Zitat:
nja und wenn man nichts angibt, dann hätte sich als Default eigentlich die kleines Einheit (also 1 Byte) gut gemacht ... und nicht 'ne willkürliche 128 tja und da sein Array 128 Byte groß ist, hat e wohl das Problem aus meiner F3 bei sich vorliegen (obwohl er wohl nach F1 geschrieben hat ... bei 128 stimmt F1 mit F3 zufällig überein :? ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz