title: TFileStream read huge files piece by piece
body: <p>Earlier today I opened a question here asking if my method to scan files in computer was correct. As solution, I received a few tips, and the one of the solutions I thought: "this need to be solved urgent!", was saying about memory overflow, once I was reading the files entirely in memory. So I started trying to find a way to read the files piece by piece, and I got something (wrong/bogus), that I need some help to figure out how to do this correctly.
  The method is simple like this for now:</p>
  
  <pre><code>procedure ScanFile(FileName: string);
  const
    MAX_SIZE = 100*1024*1024;
  var
    i, aux, ReadLimit: integer;
    MyFile: TFileStream;
    Target: AnsiString;
    PlainText: String;
    Buff: array of byte;
    TotalSize: Int64;
  begin
    if (POS('.exe', FileName) = 0) and (POS('.dll', FileName) = 0) and
        (POS('.sys', FileName) = 0) then //yeah I know it's not the best way...
      begin
        try
          MyFile:= TFileStream.Create(FileName, fmOpenRead);
        except on E: EFOpenError do
          MyFile:= NIL;
        end;
        if MyFile &lt;&gt; NIL then
        try
          TotalSize:= MyFile.Size;
          while TotalSize &gt; 0 do begin
            ReadLimit:= Min(TotalSize, MAX_SIZE);
            SetLength(Buff, ReadLimit);
            MyFile.ReadBuffer(Buff[0], ReadLimit);
            PlainText:= RemoveNulls(Buff); //this is to transform the array of bytes in string, I posted the code below too...
            for i:= 1 to Length(PlainText) do
              begin //Begin the search..
              end;
            dec(TotalSize, ReadLimit);
           end;
    finally
      MyFile.Free;
    end;
  end;
  </code></pre>
  
  <p>Code for RemoveNulls is:</p>
  
  <pre><code>function RemoveNulls(const Buff: array of byte): String;
  var
    i: integer;
  begin
    for i:= 0 to Length(Buff) do
      begin
        if Buff[i] &lt;&gt; 0 then
          Result:= Result + Chr(Ord(Buff[i]));
      end;
  end;
  </code></pre>
  
  <p>Ok, the problems I got with this code so far was:</p>
  
  <p><strong>1- each time the while is repeated, I get more memory consumed, when I was expecting to get only MAX 100MB as described in the MAX_SIZE variable, right?</strong></p>
  
  <p>2- I created a file with 2 occurrences of what should be filtered, and for some unknown reason I got about 10 repeated occurrences, looks like I'm scanning the file repeatedly.</p>
  
  <p>I appreciate your help guys, and if someone have this kind of code already done, post here please, I don't pretend to re-create the wheel...</p>