AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In Datei Suchen und Kopieren

Ein Thema von Horst0815 · begonnen am 12. Jan 2013 · letzter Beitrag vom 12. Jan 2013
Antwort Antwort
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#1

In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 17:46
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

Geändert von Horst0815 (12. Jan 2013 um 17:52 Uhr)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#2

AW: In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 18:13
Du kannst dann mit read(f, c) lesen. Bei neuen Projekten machen ich das dann mit Streams.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
MeierZwoo

Registriert seit: 3. Dez 2012
106 Beiträge
 
#3

AW: In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 18:26
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 ?).
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 19:04
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#5

AW: In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 19:30
Dankeschön
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: In Datei Suchen und Kopieren

  Alt 12. Jan 2013, 20:47
büddeschön...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 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