在C#中从特定位置读取二进制文件

6

如何从指定位置读取大型二进制文件?

我不想从文件开头开始读取,因为我已经计算出了需要读取的流的起始位置和长度。


你所需要做的就是更改Position属性或使用Seek方法。你担心整个文件都会加载到内存中吗? - Marlon
是的,我不想将整个文件加载到内存中。我使用BinaryReader,但找不到Seek方法。--> BinaryReader.BaseStream.Seek(),这就是解决方案。;-) - Skuami
你不必担心一个巨大的文件被加载到内存中。流只会一次加载其中的一部分。否则我们将永远无法打开巨大的文件。 - Marlon
4个回答

15
using (FileStream sr = File.OpenRead("someFile.dat"))
{
    sr.Seek(100, SeekOrigin.Begin);
    int read = sr.ReadByte();
    //...
}

9

根据 @shenhengbin 的回答。

使用 BinaryReader.BaseStream.Seek

using (BinaryReader b = new BinaryReader(File.Open("perls.bin", FileMode.Open)))                                                     
{
    int pos = 50000;
    int required = 2000;

    // Seek to our required position.
    b.BaseStream.Seek(pos, SeekOrigin.Begin);

    // Read the next 2000 bytes.
    byte[] by = b.ReadBytes(required);
}

1

如果你了解流,为什么不使用(File)Stream.Seek(...)?


1
我使用BinaryStream但是找不到Seek()方法。Scott的链接解释了如何在二进制读取器上获取seek方法。 BinaryReader.BaseStream.Seek(pos, SeekOrigin.Begin); - Skuami

0
当然可以。请看这里。查看偏移量,您可以从偏移量处读取。

1
不是很准确,偏移量定义的是缓冲区的偏移量而不是文件起始点的偏移量。在写这篇文章之前我尝试过这种方式。 - Skuami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接