2011-10-07 124 views
1

如果我有一個MemoryStream,我知道我發送了多個文件(例如5個文件)到這個MemoryStream。是否有可能從這個MemoryStream中讀取並能夠按文件拆分文件?閱讀包含多個文件的MemoryStream

我的直覺告訴我沒有,因爲當我們讀,我們正在逐字節閱讀......任何幫助和一個可能的片段將是偉大的。我一直無法在谷歌或這裏找到任何東西:(

+0

我認爲,因爲它按字節讀取。所以在閱讀時,如果我決定使用MemoryStream,則需要放置一個分隔符或查看文件的大小以確定文件在MemoryStream中的位置。 –

回答

3

如果不以某種方式對文件進行分隔或不知道每個文件放入緩衝區時的大小,則不能直接進行。

可以改爲使用壓縮文件(如zip文件)來傳輸多個文件。

+0

好吧,最近發生的事情是我解壓縮文件並將它們放入MemoryStream中,稍後我將使用此MemoryStream進行處理......所以我猜測我需要在MemoryStream中放置一個分隔符以指示不同的文件 –

+0

@NerdinTraining - 爲什麼不能將zip文件放入內存流中,並在需要時將每個單獨的文件上傳到自己的內存流中? – Oded

+0

我正在努力。但是當我創建MemoryStream時,這些文件是倍增的。我切換到FileStream,一切正常工作......這就是爲什麼我想把所有內容放在一個MemoryStream中 –

0

你需要自己實現這一點,你想要做的是寫入某種'分隔'到流中。 ,尋找那些分隔,你會知道什麼時候你都創下了新的文件

這裏有一個快速和骯髒的例子:。

byte[] delimiter = System.Encoding.Default.GetBytes("++MyDelimited++"); 

ms.Write(myFirstFile); 
ms.Write(delimiter); 
ms.Write(mySecondFile); 

.... 

int len; 
do { 
    len = ms.ReadByte(buffer, lastOffest, delimiter.Length); 
    if(buffer == delimiter) 
    { 
     // Close and open a new file stream 
    } 
    // Write buffer to output stream 
} while(len > 0); 
1

甲流僅僅是一個字節的行如果你把在文件流中相鄰的文件,你需要知道如何區分它們,這意味着你必須知道文件的長度,或者你應該使用一些分隔符。一些(大多數)文件類型h即使是一種標題,但是在整個流中查找它也可能不是防水的,因爲文件的標題也可能是另一個文件中的數據。

因此,如果您需要將文件寫入這樣的流,那麼添加一些額外的信息是明智的。例如,從一個版本號開始,然後寫入第一個文件的大小,寫入文件本身,然後寫下一個文件的大小,等等......

通過以版本號開始,您可以改變這種格式。將來你可能會決定你還需要存儲文件名。在這種情況下,您可以增加版本號,組成新的格式,並且仍然可以讀取您之前創建的流。

如果您也存儲這些流,這當然特別有用。

0

由於您要發送它們,您必須將它們發送到流中,以便您知道如何將它們拉出。這樣做的最常用方法是使用長度規格。例如,將文件寫入到流:

  • 寫的整數到流,以指示文件

然後,對於每個文件的數量,

  • 寫的整數(或long如果文件很大)指示文件中的字節數
  • 寫入文件

爲了讀取文件背,

  • 讀取的整數(n)來確定文件的數量流中

然後,迭代n倍,

  • 讀取的整數(或long,如果這是您選擇的)確定文件中的字節數
  • r ead文件
0

您可以改爲使用IEnumerable<Stream>