複数のストリーム操作を連鎖させたい(ファイルのダウンロード、オンザフライでの解凍、一時ファイルなしでのデータの処理など)。ファイルは7z形式です。利用可能なLZMASDKがありますが、ストリーム自体ではなく、外部の出力ストリームを作成する必要があります。つまり、出力ストリームを操作するには、出力ストリームを完全に書き込む必要があります。SevenZipSharpにもこの機能が欠けているようです。
誰かがそのようなことをしましたか?
// 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
}
各ファイルストリームは、1つのファイルを表す1回限りのストリームのように動作し、メインの圧縮ストリームでMoveNext()を呼び出すと、そのファイルは自動的に無効化されてスキップされます。
圧縮についても同様の構成を行うことができます。使用例-非常に大量のデータに対して何らかの集計を行います-dir内の7zファイルごと、内部のファイルごと、各ファイルのデータ行ごとに、いくつかの値を合計します。
更新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;
}
}