надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (RIFF WAVE) я нашёл, теперь проблема в том, чтобы сохранить Code: var FHandle, FSave, SizeFile, BytesRW, RW: Cardinal; l: Longint; oldstring: string; SIZE: DWORD; wavsize:integer; n: integer; begin FHandle := FileOpen('c:\1.bin', FmOpenRead); OldString := 'RIFF'; n:=1; SizeFile := GetFileSize(FHandle, nil); for l := 0 to SizeFile - Length(oldstring) do begin FileSeek(FHandle, l, 0); FileRead(FHandle, oldstring[1], 4); if oldstring = 'RIFF' then begin FileSeek(FHandle, l + 4, 0); Memo1.Lines.Add(IntToStr(l)); FileRead(FHandle, SIZE, 4); Memo1.Lines.Add(IntToStr(SIZE)); FileSeek(FHandle, l , 0); //тут сильно лажовый код =) FileRead(FHandle,BytesRW,size); FSave := CreateFile(pchar('_out'+Int2Digs(N, 4)+'.bmp'), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0); WriteFile(FSave, BytesRW, SizeOf(BytesRW), RW, nil); CloseHandle(FSave); //вот n:=n+1; end; Application.ProcessMessages; end; CloseHandle(FHandle); end;
Вот : Code: procedure _copy(FileNameIn: string ;// путь к входному файлу const FileNameOut: string; // путь к выходному файлу place, // позиция, откуда начать копировать tocopy: integer); // сколько символов копировать var fin, fout: System.Text; _in, _out: string; s: string; begin If not FileExists(FileNameIn) then exit; AssignFile(fin, FileNameIn); reset(fin); AssignFile(fout, FileNameOut); rewrite(fout); _in:=''; _out:=''; while not EOF(fin) do begin readln(fin, _in); _out:=_out+_in; end; s:=copy(_out, place, tocopy); writeln(fout, s); CloseFile(fin); CloseFile(fout); end; П.С. не самый шустрый алгоритм, писал "на коленке", но должно работать.
Спасибо за совет, думаю тое пригодиься кусок, гораздо проще и удобнее оказалось сделать TFileStream, там и придумывать ничего не надо - всё необходимое есть.
А вообще тут всё проще делается на API и выйдет примерно так f1=CreateFile на чтение f2=CreateFile на запись SetFilePointer для f1 на нужную тебе позицию GetMem чтобы выделить память под буфер размером чтобы вместились твои данные ReadFile f1 WriteFile f2 CloseHandle f1 CloseHandle f2 FreeMem
вот за апи спасибо, попробую и так. в принципе сейчас код работает нормально, парюсь с ускорением алгоритма поиска набора байт в файле