2011-10-10 75 views
0

我有一个方法,通过返回System.IO.FileStream指向一个文件打开阅读流文件。此时我想要做的是将流存储为System.IO.MemoryStream同时存储和返回一个FileStream

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

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

+0

我也有过类似的要求,所以我开发了一个RecordStream它,如果你告诉它,在内部存储器流保存,由读指令每次结果,并有回放选项。也许它的有用,请参阅:http://upreader.codeplex.com/SourceControl/changeset/view/d287ca854370#src%2fUpreader.Usenet.Nntp%2fEncodings%2fRecordStream.cs – Polity

+0

@Polity:我不知道这是我的正在寻找。我需要同时读取FileStream到网络流和内部MemoryStream。 – rafale

回答

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,它只是不返回

一个简单implem之前首先缓冲在读取文件一次entation将

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; 
    } 
}