Why does FileStream.Position increment in multiples of 1024?

I would agree with Stefan M., it is probably the buffering which is causing the Position to be incorrect. If it is just the number of characters that you have read that you want to track than I suggest you do it yourself, as in:

        using(FileStream fileStream = new FileStream("Sample.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
        {
            fileStream.Seek(GetLastPositionInFile(), SeekOrigin.Begin);
            /**Int32 position = 0;**/
            using(StreamReader streamReader = new StreamReader(fileStream)) 
            {
                while(!streamReader.EndOfStream) 
                {
                    string line = streamReader.ReadLine();
                    /**position += line.Length;**/
                    DoSomethingInteresting(line);
                    /**SaveLastPositionInFile(position);**/

                    if(CheckSomeCondition()) 
                    {
                        break;
                    }
                }
            }
        }

It's not FileStream that's responsible - it's StreamReader. It's reading 1K at a time for efficiency.

Keeping track of the effective position of the stream as far as the StreamReader is concerned is tricky... particularly as ReadLine will discard the line ending, so you can't accurately reconstruct the original data (it could have ended with "\n" or "\r\n"). It would be nice if StreamReader exposed something to make this easier (I'm pretty sure it could do so without too much difficulty) but I don't think there's anything in the current API to help you :(

By the way, I would suggest that instead of using EndOfStream, you keep reading until ReadLine returns null. It just feels simpler to me:

string line;
while ((line = reader.ReadLine()) != null)
{
    // Process the line
}

Tags:

C#

File

File Io