Обработка файлов 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;
    }
}
11
задан Yurik 6 January 2012 в 18:04
поделиться