hab den Post gesehn
var dat : file;
da hier keine Größe angegeben ist, wird per Default 1 verwendet.
Code:
var dat : file of [color=#ff0000]type[/color];
aber hier ist es per Default SizeOf(type)
Delphi-Quellcode:
type TNum : Array[0..127] of byte;
var dat : file of TNum;
also
"nur" so wären es 128
[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 von
Ergebnis:
---------------------------
---------------------------
F1: File * * * * * * * = 128 > 128 4096
F2: TextFile * * * *= 128 > * * - * * * *-
F3: File of TTest = * 32 > * 32 * * * -
F4: File of Byte * = * * 1 > * 32 * * 32
F5: File(1) * * * * * = * * 1 > * 32 * * 32
---------------------------
OK
---------------------------
Variante = RecSize > Size_1x32 Size_32x1
aber, egal wie es da aussieht, sollte doch BlockWrite dennoch nur das schreiben, was man angegeben hat?
(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.
TTextBuf = array[0..127] of Char;
(drum hab ich bei obrigem Code/Test 32 Byte und nicht 128 verwendet, damit man den Unterschied sieht)
hab's aber grad selber nochma in der
OH gefunden
Zitat von
OH:
Hinweis:
Wenn die Datei untypisiert deklariert ist und Sie beim Aufrufen von Reset keine Datenblockgröße angeben, nimmt FileSize eine Größe von 128 Bytes an. FileSize gibt also die Anzahl der Bytes geteilt durch 128 zurück.
ich würde dieses Verhalten ganz einfach als Fehler in Delphi ansehn, da hier 1 logischer gewesen wäre.