R3Pa4eK
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору program IFC; {$APPTYPE CONSOLE} uses Windows, SysUtils, Classes, Forms; 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; 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); Seek(F,FPos+i+3); Blockread(F,FSize,4); FSize:=FSize+8; fname:=ExtractFileName('data.7z'); 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; begin if not (FileExists(ParamStr(2))) then begin WriteLn('Error! Input file was not found!'); Exit; end; Assignfile(F, 'data.7z'); try Reset(F,1); except end; FPos:=0; Repeat Application.ProcessMessages; Blockread(F,Buffer,bufsize); TempPos:=FilePos(F)-12; Wave(Buffer,bufsize); FPos:=FPos+65523; Seek(f,TempPos); Until Filepos(f)>=Filesize(f)-bufsize; Blockread(F,Buffer,Filesize(F)-Filepos(F)); Wave(Buffer,Filesize(F)-Filepos(F)); try Closefile(F); except end; WriteLn('Found', Count, ' wave files!'); end. |