文件流Seek以及Read操作的问题(reader.BaseStream.Seek导致文件混乱问题)

 

reader.BaseStream.Seek(position, SeekOrigin.Begin);

看起来没什么问题,但是在实际使用中,只使用这段代码,会导致文件内容读取混乱!

必须使用StreamReader.DiscardBufferedData!!!

原因:

 通过调用DiscardBufferedData示例读取数据之后,可按预期方式工作。 读取前 15 个字符后,位置重置为 2 的偏移量值,则读取所有剩余的字符。 如果您删除对调用DiscardBufferedData,该示例未按预期运行。 读取前 15 个字符,但仅基础流的当前位置重置。 内部缓冲区的StreamReader对象仍位于第 16 个字符。 因此,ReadToEnd缓冲区以及从重置位置开始的基础流中的字符返回的所有字符。

注:

使用DiscardBufferedData方法来重置的内部缓冲区StreamReader对象。 您需要调用此方法时,才内部缓冲区的位置和BaseStream不匹配。 当数据读取到缓冲区,然后寻求基础流中的新位置时,这些位置可以是不匹配。 此方法会降低性能,仅当绝对必要,例如当你想要读取的内容的一部分时才应使用StreamReader对象超过一次。

出处:

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.streamreader.discardbuffereddata?redirectedfrom=MSDN&view=netframework-4.7.2#System_IO_StreamReader_DiscardBufferedData

你可能感兴趣的:(C#)