Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   In Datei Suchen und Kopieren (https://www.delphipraxis.net/172589-datei-suchen-und-kopieren.html)

Horst0815 12. Jan 2013 16:46

In Datei Suchen und Kopieren
 
ich muss eine Binary durchsuchen und ab dieser Position bis zum Ende Kopieren

Delphi-Quellcode:
Var
  Target: File;
  Ch: AnsiChar;
  Buf: byte;
Const
  tar: Array [1 .. 9] of Byte =($3E, $00, $53, $00, $47, $00, $40, $00, $3E);
begin
  MemoInfo.Clear;
  if dlgOpen.Execute then
  begin
    DoubleBuffered := True;
    Application.ProcessMessages;
    AssignFile(Target, dlgOpen.FileName);
    Reset(Target, 1);
      Seek(Target, tar);
     
    end;
und ab da häng ich sicher hilft Blockread/write aber wie durchsuche ich die datei

zeras 12. Jan 2013 17:13

AW: In Datei Suchen und Kopieren
 
Du kannst dann mit read(f, c) lesen. Bei neuen Projekten machen ich das dann mit Streams.

MeierZwoo 12. Jan 2013 17:26

AW: In Datei Suchen und Kopieren
 
Seek geht grundsätzlich nur auf DatensatzNr, bei file ist der "DatenSatz" 1 lang, also müßte seek in Anzahl der byte angegeben werden.

Da Du aber die Position eh nicht kennst, kannst du auch nichts mit seek setzen. Die Position willst Du ja erst ermitteln.

Du kannst es mit BlockRead und Lesen in einen Schiebepuffer realisieren (AnsiString). Ist aber etwas aufwendig aber auch in ein paar Zeilen lösbar. Bei einem Schiebepuffer mußt Du vorallem darauf achten, daß beim neuen Einlesen vom vorherigen puffer die letzten 9 byte/Ansichar (9 hier = Tar Länge) erhalten bleiben und nach vorne in den Puffer gesetzt werden (da ja das tar in dem Rest als Teil vorkommen kann). Und wg. der Dateiposition mitzählen.

Wenn die Datei allerdings < 4GB ist, würde ich die Datei komplett ein einem Block in einen ansistring einlesen.

Dein Such/Vergleichswert (Signatur) ware aber als Ansi- oder Shortstring (bzw. string[9]) besser deklariert. Dann kannst du das Vorkommen über die String-Behandlungs-Routinen erledigen (pos(tar,Buffer)>0 ?).

Bummi 12. Jan 2013 18:04

AW: In Datei Suchen und Kopieren
 
Ich hätte folgendes anzubieten: ACHTUNG tar ist jetzt 0 basiert.

Delphi-Quellcode:
Const
  tar: Array [0 .. 8] of Byte =($3E, $00, $53, $00, $47, $00, $40, $00, $3E);



function ByteArrayPos(const SearchArr : array of byte; const CompArr : array of byte) : integer;
// Thomas Wassermann
//  result=Position or -1 if not found
var
  Comp,Search : AnsiString;
begin
  SetString(Comp, PAnsiChar(@CompArr[0]), Length(CompArr));
  SetString(Search, PAnsiChar(@SearchArr[0]), Length(SearchArr));
  Result := Pos(Search,Comp) - 1;
end;

Function CopyFromToken(Const SrcFile,DestFile:String; const arr:Array of Byte):Boolean;
var
 // Thomas Wassermann
 src,dst:TFileStream;
 Buff:Array of Byte;
 Pos,Size:Integer;
 FoundPos:Integer;
begin
    pos := 0;
    Result := false;
    Size := High(Arr) * 100;
    FoundPos:=-1;
    src:=TFileStream.Create(SrcFile,fmOpenRead);
    try
    if Size > (src.Size - Pos) then Size := src.Size - Pos;
    while (FoundPos<0) and ((Pos+Size)<src.Size) do
        begin
         if High(Buff)+ 1 <> Size then SetLength(Buff,Size);
          src.Read(Buff[0],Size);
          FoundPos := ByteArrayPos(Arr,Buff);
          if (FoundPos<0) and (src.Position < src.Size ) and (src.Size>Size) then
            begin
              src.Position := src.Position - High(arr) - 1;
              Pos := src.Position
            end;
        end;
    if FoundPos > -1 then
        begin
          src.Position := Pos+FoundPos;
          dst := TFileStream.Create(DestFile,fmCreate);
          try
          dst.CopyFrom(src,src.Size-src.Position);
          Result := true;
          finally
            dst.Free;
          end;
        end;
    finally
       src.Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyFromToken('C:\temp\Bild 6.png','C:\temp\2.Bin',tar);
end;

Horst0815 12. Jan 2013 18:30

AW: In Datei Suchen und Kopieren
 
Dankeschön :thumb:

Bummi 12. Jan 2013 19:47

AW: In Datei Suchen und Kopieren
 
büddeschön...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz