Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл (https://forum.antichat.xyz/showthread.php?t=122385)

Jim_Di 26.05.2009 15:17

[Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл
 
надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (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

вот за апи спасибо, попробую и так.

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


Время: 14:24