![]() |
String in 3 MB großen Dateien suchen
Ich habe jetzt mal eine Frage: Gibt es eine Möglichkeit Strings in Dateien zu suchen die Größer sind als 3 MB (Datei)?
Ich habe zwar schon einiges gefunden, aber da werden nur 1MB der Datei durchsucht :( Gibt es vielleicht eine Methode der die Größe der Datei egal ist? Vielleicht hat das schonmal jemand gemacht und kann mir helfen. :love: Danke UC |
Re: String in 3 MB großen Dateien suchen
Zitat:
...:cat:... |
Re: String in 3 MB großen Dateien suchen
Es wird zwar hier nicht nach einem String sondern nach Hexwerten gesucht, ist aber das gleiche (eine Methode von himitsu):
Delphi-Quellcode:
Const Groesse = 3072000; // 3000 KB ~ 3 MB = 3000 * 1024 = 3072000 Byte
Var FS: TFileStream; Buffer: Array[0..Groesse-1] of Byte; I: Integer; B: Byte; Begin Try {Datei öffnen} FS := TFileStream.Create('C:\Test.exe', fmOpenReadWrite); {Daten einlesen} FS.Read(Buffer, Groesse); {Bytefolge suchen} For I := 0 to Groesse - 3 do If (Buffer[I] = $78) and (Buffer[I + 1] = $78) and (Buffer[I + 2] = $78) Then Begin Showmessage('Gefunden') End; FS.Free; Except On EFOpenError do ShowMessage('Datei konnte nicht geöffnet werden'); Else ShowMessage('Unbekannter Fehler'); End; End; Wenn ich das jetzt mache kommt ein Stack-Überlauf, da wahrscheinlich die Größe für den Buffer wahrscheinlich zu groß ist. Aber man muss doch über Buffer suchen oder etwa nicht :roll: Gibt's da noch eine andere Möglichkeit? |
Re: String in 3 MB großen Dateien suchen
Die einfachste Möglichkeit dürfte es sein, die maximale Stackgröße mit
Delphi-Quellcode:
entsprechend zu erhöhen.
{$MAXSTACKSIZE 4000000} // max. Stackgröße etwa 4 MB
|
Re: String in 3 MB großen Dateien suchen
Danke funktioniert, hat das irgendwelche Nachteile bzw. muss ich den Stack dann am Ende wieder "runterschrauben"?
|
Re: String in 3 MB großen Dateien suchen
Zitat:
Zitat:
|
Re: String in 3 MB großen Dateien suchen
Zitat:
Delphi-Quellcode:
Var FS: TFileStream;
{dynamisches Array verwenden} Buffer: Array of Byte; I: Integer; B: Byte; Begin Try {Datei öffnen} FS := TFileStream.Create('C:\Test.exe', fmOpenReadWrite); {Speicher für Buffer allozieren} SetLength(Buffer,FS.Size); {Daten einlesen (8ung: Buffer>>[0]<<} FS.Read(Buffer[0],Length(Buffer)); {Bytefolge suchen} For I := 0 to Length(Buffer) - 3 do If (Buffer[I] = $78) and (Buffer[I + 1] = $78) and (Buffer[I + 2] = $78) Then Begin Showmessage('Gefunden') End; FS.Free; Except On EFOpenError do ShowMessage('Datei konnte nicht geöffnet werden'); Else ShowMessage('Unbekannter Fehler'); End; End; |
Re: String in 3 MB großen Dateien suchen
:love: Danke schön funktioniert einwandfrei :thuimb:
|
Re: String in 3 MB großen Dateien suchen
Hallo Uncle Cracker,
ich empfehle Dir den ![]() Ich habe dort ein Beispiel-Projekt und die Komponente hinterlegt. Außerdem eine kleine Powerpoint-Präsentation, die den Algo erklärt. Die Suche läuft knatter schnell. |
Re: String in 3 MB großen Dateien suchen
@JS
Also bei meinem Test mit deiner mitgelieferten Datei stimmte das Ergebnis nicht, dass ich erhalten hatte. Lag vielleicht daran, dass die Datei 2.5 MB groß war. Noch eine etwas andere Frage die was damit zutun hat, aber ich nicht extra einen neuen Thread aufmachen möchte: Kann man die die Abfrage nicht eigentlich auch irgendwie einfacher machen also die ganze Zeit immer mit "and" die Werte zuverknüpfen? Vielleicht mit einem Array:
Delphi-Quellcode:
const
MyArry:array[0..2] of Byte= ($78, $78, $78); Habe das zwar probiert aber das will nicht wirklich, denn die Abfrage mit "Buffer[I] = " bekomme ich irgendwie nicht hin :( Hätte vielleicht da noch jemand eine Lösung? :love: Danke UC |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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 by Thomas Breitkreuz