C# 如何截断文件流以仅读取特定字节?

C# 如何截断文件流以仅读取特定字节?,c#,c#-4.0,C#,C# 4.0,如何截断文件流以仅读取特定字节。 例如:我希望FileStream从位置10发送下一个100字节 我的代码: public System.IO.Stream GetFileStream() { FileStream fs = File.OpenRead(filePath); fs.Seek(10, SeekOrigin.Begin); //setting start position //How to set the length

如何截断文件流以仅读取特定字节。 例如:我希望FileStream从位置10发送下一个100字节

我的代码:

    public System.IO.Stream GetFileStream()
    {
        FileStream fs = File.OpenRead(filePath);
        fs.Seek(10, SeekOrigin.Begin); //setting start position

        //How to set the length or the end position of the stream here?

        return fs;
    }

   private void TestFileCopy()
    {
        FileStream fs = GetFileStream();
        FileStream fsCopy = File.OpenWrite(filePathCopy);

        fs.CopyTo(fsCopy);
    }
我可以设置开始位置,但无法找到如何在几个字节后说流停止
在TestFileCopy方法中,我只想复制流,不需要任何位置和长度数据
在GetFileStream方法中,我希望流将字节从位置A传递到位置B。

谢谢

如果您想要一个实际的流实例,它只表示所需的字节,那么您要么需要编写自己的包装器(我在过去几年中至少实现了几次“SubsetStream”类……这并不太难),要么您只需读取所需的字节,将它们复制到MemoryStream中,然后将该MemoryStream作为流实例返回给实际需要它的代码

当然,如果您实际上不需要流实例,那么简单地跟踪剩余的总字节数以便知道何时停止读取应该不会太难。比如:

int bytesLeft = ...; // initialized to whatever

while (bytesLeft > 0)
{
    int bytesRead = fs.Read(rgb, 0, Math.Min(rgb.Length, bytesLeft));

    bytesLeft -= bytesRead;
}

在您的示例中,您似乎可以完全控制读取输入流的代码和写入输出的代码。因此,您应该能够对其进行更改,使其不需要流作为输出的输入,您只需在从输入中立即读取字节时写入它们。

我认为没有任何内置功能可以做到这一点-您需要编写自己的包装器,最好是从实现限制的
Stream
而不是
FileStream
派生的(根据您是否希望支持在有限的范围内搜索,限制可能简单也可能复杂)。是的,我可能已经知道了,但我希望我错过了FileStream api中的一些内容。为什么从Stream类派生比从FileStream类派生更好?因为底层流是
FileStream
与任何其他类型的流没有本质上的区别-您只想接受一个基流并假装它是一个较小的流-因此,如果您只在
流的术语
。与加密流类可以接受任何其他类型的流的方式相同,因此您最终可以使用一小组工具,将来可以以不同的方式重新组合。