同时存储和返回FileStream

时间:2011-10-10 07:42:51

标签: c# filestream memorystream

我有一个方法可以通过返回指向打开以供阅读的文件的System.IO.FileStream来传输文件。此时我想要做的是将流存储到System.IO.MemoryStream中。

最简单的选择是首先将FileStream读入MemoryStream,然后将MemoryStream返回给调用者。但是这意味着我必须在返回之前将整个文件缓冲到内存中,从而将流响应延迟到调用者。

我想做的事情(如果可能的话)是将FileStream读入MemoryStream并同时将其传递给调用者。这样,文件在返回之前不必缓冲,最终仍然存储到MemoryStream中。

1 个答案:

答案 0 :(得分:1)

您可以创建Stream类的自定义实现,在其中将数据红色写入内存流,或使用我的版本,可以在以下位置找到:http://upreader.codeplex.com/SourceControl/changeset/view/d287ca854370#src%2fUpreader.Usenet.Nntp%2fEncodings%2fRecordStream.cs

可以通过以下方式使用:

using (FileStream fileStream = File.Open("test.txt", FileMode.Open))
using (RecordStream recordStream = new RecordStream(fileStream))
{
    // make sure we record incoming data
    recordStream.Record();

    // do something with the data
    StreamReader reader = new StreamReader(recordStream);
    string copy1 = reader.ReadToEnd();

    // now reset 
    recordStream.Playback();

    // do something with the data again
    StreamReader reader = new StreamReader(recordStream);
    string copy2 = reader.ReadToEnd();

    Assert.AreEqual(cop1, copy2);
}

我特别为网络流构建了这个类,但它对fileStream同样有效,它只读取文件一次,而不是在返回之前先缓冲它

一个简单的实现是

class RecordStream : Stream
{
    public Stream BaseStream { get; }

    public MemoryStream Record { get; }

    ....

    public override int  Read(byte[] buffer, int offset, int count)
    {
      int result = BaseStream.Read(buffer, offset, count);

        // store it
        Record.Write(buffer, offset, count);

        return result;
    }
}