Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

Re: blockwrite sehr sehr große datei.

  Alt 28. Jan 2008, 00:13
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat