如何截断FileStream只读取特定的字节?

时间:2014-10-15 07:14:37

标签: c# c#-4.0

如何截断FileStream以仅读取特定字节。 例如:我希望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. 感谢

1 个答案:

答案 0 :(得分:2)

如果你想要一个实际的Stream实例,它实际上代表了所需的字节而不是更多,那么你需要编写自己的包装器(我已经实现了一个" SubsetStream"类至少有一对多年来的时间......它并不太难),或者你可以只读取你想要的字节,将它们复制到MemoryStream中,然后将MemoryStream作为Stream实例返回,无论代码实际需要它。

当然,如果你真的不需要一个Stream实例,那么只需跟踪剩余的读取总字节数,以便你知道何时停止阅读不应该太难。类似的东西:

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

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

    bytesLeft -= bytesRead;
}

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