使用SeekOrigin.Begin的FileStream.Seek()是否在不需要搜索的情况下进行优化?

时间:2016-07-28 21:20:38

标签: c# filestream

我有一个类,使用FileStream从大文件一次一行地读取图像数据。在内部,文件被分成几个块,每个块看起来像这样:

=================
| Header        |
=================
| Data I Want   |
=================
| Data I Ignore |
=================

为了读取一行数据,我计算哪个块具有我想要的行,Seek()到适当的偏移量,并读取固定数量的字节。当从一个块中读取多个行时,我实际上可以跳过所有Seek()个调用但是第一个,因为指针已经在Read()之后已经到达我想要的位置。但是当我跳到一个新的块时我需要Seek()。为简单起见,我总是使用Seek()计算文件中下一行的绝对偏移量,并计算SeekOrigin.Begin到它的绝对偏移量。 FileStream.Seek()(或基础SetFilePointer()原生函数)是否经过优化以识别给定的搜索是否为无操作?如果没有,我应该优化我自己的代码,因为它不是完全闪电般的。

2 个答案:

答案 0 :(得分:1)

如果您在这里查看FileStream.Seek源代码: http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs,329c77a859ac60bd

您可以看到,无论文件指针的旧位置如何,都会调用SeekCore方法,该方法本身调用Win32Native.SetFilePointer,这是一个内核调用。

所以答案是否定的,它没有经过优化,如果可以的话,你应该自己优化它。

答案 1 :(得分:1)

答案似乎是肯定的。

这里唯一关心的是读缓冲区。我们可以假设底层的SetFilePointer()调用将是一个非搜索到当前的操作。

当您查阅source for Seek时,您可以看到尝试尽可能多地保留读取缓冲区。