Цитата: Код жгучий конечно
Цитата: хттп://gp.17slon.com/gp/gphugefile.htm
Хм.. Переписал код под этот компонент, получилось как то так:
[more=Код]
program test;
{$APPTYPE CONSOLE}
uses
Windows, GpHugeF, SysUtils, Forms, Classes;
const bufsize=65535;
type
TFileInfo = record
Name: AnsiString;
Size: Longint;
StartOffset: Longint;
end;
TBuffer = Array [1..bufsize] of Char;
var
Count: Integer;
List: Array[1..bufsize] of TFileInfo;
Buffer: TBuffer;
F, F2: File;
FSize, FPos, TempPos, tmpsize:longint;
Input: TFileInfo;
i: Integer;
File64: TGpHugeFile;
Procedure Wave(Buffer: TBuffer; BufSize: Integer);
var i: Longint;
k: Integer;
fname: String;
Begin
for i:=1 to BufSize-12 do Begin
if buffer[i]='R' then
if buffer[i+1]='I' then
if buffer[i+2]='F' then
if buffer[i+3]='F' then
if buffer[i+8]='W' then
if buffer[i+9]='A' then
if buffer[i+10]='V' then
if buffer[i+11]='E' then Begin
Inc(Count);
File64.Seek(FPos+i+3);
File64.BlockRead(FSize,4, HInstance);
FSize:=FSize+8;
fname:=ExtractFileName('data.pak');
input.Name:='';
k:=1;
repeat
input.Name:=input.Name+fname[k];
inc(k);
until (k=8)or(fname[k]='.');
input.Name:= IntToHex(FSize, 16) + '_' + IntToHex(FPos+i-1, 16) + '.wav';
input.Size:= FSize;
input.StartOffset:=FPos+i-1;
List[count]:=input;
End;
End;
End;
procedure SetFileSize(FileName: AnsiString; NewSize: Int64);
var fs: TFileStream;
begin
fs:= TFileStream.Create(FileName, fmOpenReadWrite);
fs.Size:= NewSize;
fs.Free;
end;
begin
File64:= TGpHugeFile.Create('data.pak');
File64.Reset(1);
FPos:=0;
Repeat
Application.ProcessMessages;
File64.BlockRead(Buffer, bufsize, HInstance);
TempPos:= File64.FilePos - 12;
Wave(Buffer, bufsize);
FPos:= FPos + bufsize;
File64.Seek(TempPos);
Until File64.FilePos >= File64.FileSize-bufsize;
File64.BlockRead(Buffer, File64.FileSize-File64.FilePos, HInstance);
Wave(Buffer, File64.FileSize-File64.FilePos);
File64.Truncate;
File64.Close;
Writeln(Count);
end.
[/more]
Wav-файлы он нашел. Но осталась прежняя проблема. Попробовал скормить ему файл, размером 5,11 ГБ (5 497 558 131 байт), программа закрылась после 20 сек. работы. Возможно это связано с тем, что bufsize=65535? Может нужно, чтобы bufsize = filesize?
Добавлено: В общем, попробовал подставить вместо BufSize размер файла. Программа просто закрывается, видимо переполнение буффера. Даже не знаю, что делать...