为什么FileStream.Position以1024的倍数递增?

Ste*_*ser 10 c# file-io file

我有一个文本文件,我想逐行读取并记录文本文件中的位置.在读取文件的任何行后,程序可以退出,我需要在恢复时在下一行继续读取该文件.

以下是一些示例代码:

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

            if (CheckSomeCondition())
            {
                break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这段代码时,fileStream.Position读取每一行后,它的值不会改变,只有在读完几行后才会前进.当它发生变化时,它会以1024的倍数增加.现在我假设有一些缓冲正在进行,但我怎样才能记录文件中的确切位置?

Jon*_*eet 10

这不是FileStream负责任的 - 这是StreamReader.为了提高效率,它一次读取1K.

尽可能跟踪流的有效位置StreamReader是棘手的...特别是因为ReadLine将丢弃行结束,所以你不能准确地重建原始数据(它可能以"\n"或"\r \n"个).如果StreamReader暴露一些东西以使这更容易(我很确定它可以这样做没有太多困难)会很好但我不认为当前的API中有任何东西可以帮助你:(

顺便说一句,我建议EndOfStream你不要使用,而是继续阅读,直到ReadLine返回null.这让我感觉更简单:

string line;
while ((line = reader.ReadLine()) != null)
{
    // Process the line
}
Run Code Online (Sandbox Code Playgroud)