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]