PDA

Просмотр полной версии : [Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл


Jim_Di
26.05.2009, 15:17
надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (RIFF WAVE) я нашёл, теперь проблема в том, чтобы сохранить


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;

intNet
31.05.2009, 18:39
надо скопировать с указанного места кусок нужной длины и сохранить в файл
Вот :

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;

П.С. не самый шустрый алгоритм, писал "на коленке", но должно работать.

Jim_Di
31.05.2009, 18:52
Спасибо за совет, думаю тое пригодиься кусок, гораздо проще и удобнее оказалось сделать TFileStream, там и придумывать ничего не надо - всё необходимое есть.

slesh
01.06.2009, 00:33
А вообще тут всё проще делается на API и выйдет примерно так
f1=CreateFile на чтение
f2=CreateFile на запись
SetFilePointer для f1 на нужную тебе позицию
GetMem чтобы выделить память под буфер размером чтобы вместились твои данные
ReadFile f1
WriteFile f2
CloseHandle f1
CloseHandle f2
FreeMem

Jim_Di
01.06.2009, 07:30
вот за апи спасибо, попробую и так.

в принципе сейчас код работает нормально, парюсь с ускорением алгоритма поиска набора байт в файле