![]() |
In Datei Suchen und Kopieren
ich muss eine Binary durchsuchen und ab dieser Position bis zum Ende Kopieren
Delphi-Quellcode:
und ab da häng ich sicher hilft Blockread/write aber wie durchsuche ich die datei
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; |
AW: In Datei Suchen und Kopieren
Du kannst dann mit read(f, c) lesen. Bei neuen Projekten machen ich das dann mit Streams.
|
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 ?). |
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; |
AW: In Datei Suchen und Kopieren
Dankeschön :thumb:
|
AW: In Datei Suchen und Kopieren
büddeschön...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz