Обработка файлов 7z в виде потоков .NET

Я хотел бы связать несколько потоков (например, загружать файл, разжимать его на лету и обрабатывать данные без каких-либо временных файлов). Файлы находятся в формате 7z. Доступен LZMA SDK, но заставляет меня создавать внешний выходной поток вместо того, чтобы быть самим потоком - другими словами, выходной поток должен быть полностью написан, прежде чем я смогу с ним работать. Кажется, что 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
}

Каждый поток файлов будет вести себя как поток с однократной записью, представляющий один файл, и вызов MoveNext() в основном сжатом потоке автоматически приведет к недействительности и пропущу этот файл.

Аналогичные конструкции могут быть выполнены для сжатия. Пример использования - выполните некоторую агрегацию на очень большом количестве данных - для каждого 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;
    }
}

Ответ 1

Подлежащий алгоритму и параметрам, указанным во время сжатия, определяет размер используемых кусков, и нет способа гарантировать, что при декодировании фрагментов они падают на границы слов/строк. Таким образом, перед обработкой вам придется полностью распаковать файл.

То, что вы просите сделать, возможно, невозможно без временных файлов - на что он действительно зависит, есть ли у вас достаточно памяти для хранения распакованного файла с помощью MemoryStream, выполнения всей вашей обработки и последующего освобождения памяти бассейн. Дальнейшее усложнение этого - фрагментация (памяти процесса), что вы могли бы сделать это несколько раз.