delphi
Function ScanFile( Const filename: String; Const forString: String; caseSensitive: Boolean ): LongInt; Const BufferSize= $8001; Var pBuf, pEnd, pScan, pPos : Pchar; filesize: LongInt; bytesRemaining: LongInt; bytesToRead: Word; F : File; SearchFor: Pchar; oldMode: Word; Begin Result := -1; If (Length( forString ) = 0) or (Length( filename ) = 0) Then Exit; SearchFor := Nil; pBuf := Nil; AssignFile( F, filename ); oldMode := FileMode; FileMode := 0; Reset( F, 1 ); FileMode := oldMode; try SearchFor := StrAlloc( Length( forString )+1 ); StrPCopy( SearchFor, forString ); If not caseSensitive Then AnsiUpper( SearchFor ); GetMem( pBuf, BufferSize ); filesize := System.Filesize( F ); bytesRemaining := filesize; pPos := Nil; While bytesRemaining > 0 Do Begin If bytesRemaining >= BufferSize Then bytesToRead := Pred( BufferSize ) Else bytesToRead := bytesRemaining; BlockRead( F, pBuf^, bytesToRead, bytesToRead ); pEnd := @pBuf[ bytesToRead ]; pEnd^:= #0; pScan := pBuf; While pScan < pEnd Do Begin If not caseSensitive Then AnsiUpper( pScan ); pPos := StrPos( pScan, SearchFor ); If pPos <> Nil Then Begin { Found it! } Result := FileSize - bytesRemaining + LongInt( pPos ) - LongInt( pBuf ); Break; End; pScan := StrEnd( pScan ); Inc( pScan ); End; If pPos <> Nil Then Break; bytesRemaining := bytesRemaining - bytesToRead; If bytesRemaining > 0 Then Begin Seek( F, FilePos(F)-Length( forString )); bytesRemaining := bytesRemaining + Length( forString ); End; End; finally CloseFile( F ); If SearchFor <> Nil Then StrDispose( SearchFor ); If pBuf <> Nil Then FreeMem( pBuf, BufferSize ); end; end;
Saludos!