2010-09-14 68 views
10

我想鏈接多個流操作(如下載文件,動態解壓縮以及處理沒有任何臨時文件的數據)。這些文件是7z格式。有一個LZMA SDK可用,但迫使我創建一個外部輸出流,而不是一個流本身 - 換句話說,輸出流將不得不完全寫入,然後才能使用它。 SevenZipSharp似乎也缺少這項功能。將7z文件當作.NET流處理

有沒有人做過這樣的事情?

// in pseudo-code - CompressedFileStream derives from Stream 
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url)) 
{ 
    Console.WriteLine("Processing file {0}", f.Name); 
    ProcessStream(f); // further streaming, like decoding, processing, etc 
} 

每個文件流將像一個只讀一次流代表一個文件,上述主壓縮流上調用的MoveNext()將自動失效&跳過該文件。

類似的構造可以完成壓縮。使用示例 - 對大量數據進行聚合 - 對於dir中的每個7z文件,對於每個文件,對於每個文件中的每個數據行,總結一些值。

UPDATE 2012-01-06

#ziplib(SharpZipLib)已經不正是我需要的zip文件與ZipInputStream類。下面是一個例子,它將所有文件都視爲給定zip文件中不可查看的流。仍在尋找7z解決方案。

IEnumerable<Stream> UnZipStream(Stream stream) 
{ 
    using (var zipStream = new ZipInputStream(stream)) 
    { 
     ZipEntry entry; 
     while ((entry = zipStream.GetNextEntry()) != null) 
      if (entry.IsFile) 
       yield return zipStream; 
    } 
} 

回答

0

在壓縮時指定的基本算法和參數確定所使用的塊的大小,並且沒有辦法確保你解碼塊,它們落入在字/行邊界。所以,在處理之前你必須完全解壓文件。

你所要求做的是可能不可能沒有臨時文件 - 它到底要看的是你是否有足夠的內存,以保持解壓縮文件的打開通過一個MemoryStream,執行所有的處理,然後釋放內存回到游泳池。更復雜的是你可能會導致重複這樣做的碎片(進程內存)。

+0

我不確定我是否明白你的意思是由單詞/行的邊界。壓縮文件流對象在SevenZip從流接收文件頭的時刻返回,而不是在獲得整個文件之後。讀取解壓縮文件的數據也會導致源碼流也向前移動。 – Yurik 2012-01-05 23:56:51