2011-10-10 78 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; 
    } 
}