VB.Net(.Net Framework4.8+)支持Seek和Peek的文件流有哪些?
.NET Framework 4.8+ 中支持 Seek() 的流及替代方案
首先纠正一个误解:.NET Framework 4.8及以上版本并没有移除Seek()方法——它是Stream基类的核心方法之一,只要流支持随机访问,就可以正常调用。你提到的BaseStream通常是指BinaryReader/BinaryWriter等包装类暴露的底层流,只要底层流本身支持定位,就能通过它调用Seek()。
支持Seek()的常见流实现
FileStream:最常用的文件操作流,完全支持随机访问,直接调用Seek()或设置Position属性都能完成定位。MemoryStream:内存中的数据流,支持任意位置的定位操作,适合处理内存中的临时数据。BufferedStream:如果它包装的底层流(比如FileStream)支持定位,那么它也能正常调用Seek()。- 注意:像
NetworkStream这类顺序流不支持定位(CanSeek属性返回False),调用Seek()会抛出异常。
替代VB旧方法的解决方案
以下是纯.NET的实现方式,无需依赖VB6兼容的FileOpen()或My.MyComputer.SystemFile.Seek():
直接使用FileStream定位
Using fs As New FileStream("yourfile.dat", FileMode.Open, FileAccess.Read) ' 定位到文件起始位置后第200字节处 fs.Seek(200, SeekOrigin.Begin) ' 或者直接设置Position属性,效果完全等价 ' fs.Position = 200 ' 读取数据 Dim buffer(511) As Byte Dim readCount = fs.Read(buffer, 0, buffer.Length) End Using
通过BinaryReader/Writer的BaseStream定位
如果用包装类处理数据,可通过BaseStream访问底层流的定位功能:
Using writer As New BinaryWriter(File.OpenWrite("output.bin")) ' 写入初始数据 writer.Write("Hello") ' 定位到文件开头,覆盖原有内容 writer.BaseStream.Seek(0, SeekOrigin.Begin) writer.Write("Hi") End Using
关键提示
在调用Seek()前,可以先检查流的CanSeek属性,确认当前流支持定位操作,避免抛出异常:
If fs.CanSeek Then fs.Seek(100, SeekOrigin.Current) End If
内容的提问来源于stack exchange,提问作者schlebe
相关产品推荐
相关产品推荐

