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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Jim_Di, 26 May 2009.

  1. Jim_Di

    Jim_Di Member

    Joined:
    20 Nov 2008
    Messages:
    40
    Likes Received:
    22
    Reputations:
    6
    надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (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;
    
     
    #1 Jim_Di, 26 May 2009
    Last edited: 26 May 2009
  2. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Вот :
    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;
    
    П.С. не самый шустрый алгоритм, писал "на коленке", но должно работать.
     
    1 person likes this.
  3. Jim_Di

    Jim_Di Member

    Joined:
    20 Nov 2008
    Messages:
    40
    Likes Received:
    22
    Reputations:
    6
    Спасибо за совет, думаю тое пригодиься кусок, гораздо проще и удобнее оказалось сделать TFileStream, там и придумывать ничего не надо - всё необходимое есть.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А вообще тут всё проще делается на API и выйдет примерно так
    f1=CreateFile на чтение
    f2=CreateFile на запись
    SetFilePointer для f1 на нужную тебе позицию
    GetMem чтобы выделить память под буфер размером чтобы вместились твои данные
    ReadFile f1
    WriteFile f2
    CloseHandle f1
    CloseHandle f2
    FreeMem
     
    1 person likes this.
  5. Jim_Di

    Jim_Di Member

    Joined:
    20 Nov 2008
    Messages:
    40
    Likes Received:
    22
    Reputations:
    6
    вот за апи спасибо, попробую и так.

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