c# - 读取文件的特定字节

Ahm*_*her 30 c# byte

有没有办法从文件中读取特定的字节?

例如,我有以下代码来读取文件的所有字节

byte[] test = File.ReadAllBytes(file);
Run Code Online (Sandbox Code Playgroud)

我想读取从偏移50到偏移60的字节并将它们放在一个数组中.

Rob*_*ani 53

创建一个BinaryReader,从字节50开始读取10个字节:

byte[] test = new byte[10];
using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open)))
{
    reader.BaseStream.Seek(50, SeekOrigin.Begin);
    reader.Read(test, 0, 10);
}
Run Code Online (Sandbox Code Playgroud)

  • Stream.Seek方法采用两个参数。应该是`reader.BaseStream.Seek(50,SeekOrigin.Begin);` (2认同)

das*_*ght 28

这应该做到这一点

var data = new byte[10];
int actualRead;

using (FileStream fs = new FileStream("c:\\MyFile.bin", FileMode.Open)) {
    fs.Position = 50;
    actualRead = 0;
    do {
        actualRead += fs.Read(data, actualRead, 10-actualRead);
    } while (actualRead != 10 && fs.Position < fs.Length);
}
Run Code Online (Sandbox Code Playgroud)

完成后,data文件的偏移量为50到60之间将包含10个字节,并且actualRead将包含0到10之间的数字,表示实际读取了多少字节(当文件至少有50个但小于60个字节时,这是有意义的) .如果文件少于50个字节,您将看到EndOfStreamException.

  • 您应该始终根据需要检查 Read 和 loop 的返回值。即使还有 20000 个字节可用,Read 返回 1 也是合法的。 (2认同)

use*_*016 11

LINQ版本:

byte[] test = File.ReadAllBytes(file).Skip(50).Take(10).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 这里将读取所有文件内容,然后仅使用10个字节.不是最优的方法:) (50认同)
  • 这不应该是公认的答案 (11认同)
  • 这太可怕了,并且破坏了仅从文件的一部分读取的全部目的。 (2认同)
  • 像这样的答案就是 LINQ 的性能名声如此糟糕的原因。9 票也意味着人们已经实施了这个解决方案。现在,当请求加载文件的一小部分时,有一些看起来无辜的 util 函数等待加载应用程序,而文件本身比计算机的 RAM 大。可怜的兄弟们不得不调试崩溃 (2认同)