2015-02-09 130 views
2

我有一個應用程序,我很快就堅持大量的二進制數據。我目前有兩個不同的數據通道可以獨立增長,所以我使用兩個文件來存儲這個通道。然而,這兩個文件彼此緊密耦合(在另一個文件的上下文中僅有意義的ID參考),所以爲了傳輸和適當的連接,將它們作爲單個存儲/傳輸文件。將多個文件流合併成一個文件?

有沒有一些標準的方式,無論是在操作系統級別還是在.NET BCL中構建兩個可以在同一底層文件內獨立增長的FileStream對象?

我已經考慮實現某種分塊/分頁方案,但它讓我感到基本上重複了文件系統已經在底層做了什麼,所以我寧願讓文件系統管理它,如果它是可能。

另一種替代方法是在錄製完成後使用後期處理工具合併兩個文件。這是可管理的,但並不理想。

我也嘗試過一些輕量級數據庫選項,但它們已被證明對我所做的事情來說太慢了。

對於這個問題的理想解決方案可以擴展到同一個文件中的兩個以上的數據流,儘管兩個數據流對於我目前的用途來說已經足夠了。

+0

你需要的任何類型的結構在最終文件中,我的意思是一旦你關閉了兩個流,你需要什麼,但你的程序,你可以改變以適應文件格式,打開文件?假設你最終得到了塊1 +塊2,一個有效的存儲可以類似於一個zip文件,或者你需要它們在最終文件中是第一個塊1,然後是第二塊的字節到字節。 – 2015-02-09 18:15:51

+0

應該怎麼做那工作?新字節寫入單個文件的位置在哪裏?一些分頁? – DrKoch 2015-02-09 18:16:18

+0

有[COM結構化存儲](http://en.wikipedia.org/wiki/COM_Structured_Storage) - 我在其中一個產品中使用它來將多個相互關聯的數據流存儲到單個物理文件中。儘管這有些過時的技術,但從C#中使用可能有些尷尬。我不確定是否有基於.NET的對等項。 – 2015-02-09 18:17:44

回答

1

如果您只是希望它看起來像單個文件,則可以使用NTFS備用數據流(NTFS Alternate Data Streams - .NET)。

請注意,許多工具在文件操作過程中會忽略備用數據流,因此如果需要移動此文件,請小心。

3

我只想去找一個zip文件。 Ionic dotnetzip作品非常精美,流,這樣你就不會最終不得不將它們加載到內存中(我們使用這種技術來壓縮了巨大的有效載荷,無需關閉服務器):

using(var z = new ZipFile()) 
{ 
    z.AddEntry("file1", (name, stream) => 
    { 
     someSourceStream1.CopyTo(stream); 
    }); 
    z.AddEntry("file2", (name, stream) => 
    { 
     someSourceStream2.CopyTo(stream); 
    }); 
    z.Save(@"some\path.zip"); 
    //or 
    //z.Save(someOutputStream); 
} 
相關問題