我想鏈接多個流操作(如下載文件,動態解壓縮以及處理沒有任何臨時文件的數據)。這些文件是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;
}
}
我不確定我是否明白你的意思是由單詞/行的邊界。壓縮文件流對象在SevenZip從流接收文件頭的時刻返回,而不是在獲得整個文件之後。讀取解壓縮文件的數據也會導致源碼流也向前移動。 – Yurik 2012-01-05 23:56:51