Mam problem, chcę napisac program do robienia kopii plików we własnym formacie.

Zadeklarowałem więc dwa rekordy:

TData = array[1..4096] of Byte;
  //<ort>Nagluwek</ort> każdego nowego pliku
  TFileHeader = packed record
    FDir : String[255];
    FName : string[255];
    FileAttr : Integer;
  end;
  //Dane w pliku
  TFileData = packed record
    FData : TData;
    RealSize : Integer;
    LastPart : Boolean;
  end;

Następnie napisałem dwie procedury:

procedure TForm1.MakeImage(const Files: TStrings; const FName: String);
var
   InputFile, OutputFile : File;
   FileHeader : TFileHeader;
   FileData : TFileData;
   i, tempAttr : integer;
begin
     AssignFile(OutputFile, FName);
     Rewrite(OutputFile, 1);
     ProgressBar1.Max := Files.Count - 1;

     for i := 0 to Files.Count - 1 do
     begin
          Application.ProcessMessages;
          
          ProgressBar1.Position := i;
          Label1.Caption := Files[i];

          Application.ProcessMessages;

          FileHeader.FileAttr := FileGetAttr(Files[i]);
          FileHeader.FName := ExtractFileName(Files[i]);

          tempAttr := FileGetAttr(Files[i]);

          FileSetAttr(Files[i], faArchive);

          BlockWrite(OutputFile, FileHeader, SizeOf(FileHeader));

          AssignFile(InputFile, Files[i]);
          Reset(InputFile, 1);

          ProgressBar2.Max := FileSize(InputFile);

          while not Eof(InputFile) do
          begin
               ProgressBar2.Position := FilePos(InputFile);
               
               Application.ProcessMessages;

               BlockRead(InputFile, FileData.FData, SizeOf(FileData.FData), FileData.RealSize);

               Application.ProcessMessages;

               BlockWrite(OutputFile, FileData, SizeOF(FileData));
          end;

          CloseFile(InputFile);

          FileSetAttr(Files[i], tempAttr);
     end;

     CloseFile(OutputFile);
end;

procedure TForm1.ExtractImage(const FName, Dir: String);
var
   InputFile, OutputFile : file;
   FileHeader : TFileHeader;
   FileData : TFileData;
begin
     ShowMessage('GO!');

     AssignFile(InputFile, FName);
     Reset(InputFile, 1);

     ProgressBar3.Max := FileSize(InputFile);

     while not Eof(InputFile) do
     begin
          ProgressBar3.Position := FilePos(InputFile);
          
          Application.ProcessMessages;

          if not FileData.LastPart then 
          begin
               BlockRead(InputFile, FileData, SizeOf(FileData));
               BlockWrite(OutputFile, FileData.FData, FileData.RealSize);
               Continue;
          end;

          BlockRead(InputFile, FileHeader, SIZEOF(FileHeader));

          Memo2.Lines.Add(FileHeader.FName);

          Label2.Caption := FileHeader.FName;
          
          Application.ProcessMessages;

          AssignFile(OutputFile, Dir + FileHeader.FName);
          Rewrite(OutputFile, 1);

          BlockRead(InputFile, FileData, SizeOf(FileData));
          BlockWrite(OutputFile, FileData.FData, FileData.RealSize);
     end;
end;

Czy ktoś wie dlaczego po sapakowaniu dużej ilości danych > 1GB podczas rozpakowywania wywala błąd braku dostępu [glowa]