2010-09-14 25 views
10

Birden çok akış işlemlerini (bir dosyayı karşıdan yükleyerek, anında sıkıştırmayı açarak ve verileri geçici dosya olmadan işlerken) zincirlemek istiyorum. Dosyalar 7z formatındadır. Kullanılabilir bir LZMA SDK'sı var, fakat bir yayın akışı olmak yerine bir dış çıkış akışı oluşturmam için beni zorluyor - başka bir deyişle, çıktı akışının onunla çalışmaya başlamadan önce tamamen yazılması gerekiyor. SevenZipSharp da bu işlevselliği kaçırıyor gibi görünüyor.7z dosyalarını .NET akışları olarak işleme koyma

Böyle bir şey yapan oldu mu?

// 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 
} 

Her dosya akışı gibi davranır salt bir kez dosyayı temsil eder ve otomatik olarak & bu dosyayı atlamak kılacak ana sıkıştırılmış akışta) (MoveNext çağrılıyor akışı.

Benzer yapılar sıkıştırma için de yapılabilir. Örnek kullanım - çok büyük miktarda veri üzerinde bir miktar toplama yapın - her bir dosyadaki her 7z dosyası için, her dosyadaki her dosya için her dosya için bir miktar değer toplayın.

GÜNCELLEME 2012-01-06

#ziplib (SharpZipLib) zaten tam olarak ZipInputStream sınıfla zip dosyaları için gerekenleri yapar. İşte, tüm dosyaları belirli bir zip dosyası içinde görünmez akışlar olarak veren bir örnektir. Hala 7z çözümü arıyor. Sıkıştırma işlemi sırasında belirtilen

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

cevap

0

yatan algoritma ve parametreler kullanılan parçalar boyutunu belirlemek ve parçalar deşifre olarak, onlar kelime/satır sınırlarında düşmek sağlamak için hiçbir yolu yoktur. Yani, işlemeden önce bir dosyayı tamamen açmanız gerekecek.

Ne yapmak istiyoruz geçici dosyaları olmadan muhtemelen mümkün değildir - bu, gerçekte bağlıdır Bir MemoryStream aracılığıyla açık sıkıştırılmış dosyayı tutmak için yeterli hafızaya sahip olup olmadığıdır, tüm işlem gerçekleştirmek ve daha sonra belleği serbest havuza geri dön. Bunu daha da karmaşık hale getirmek, bunu tekrar tekrar yapmanıza neden olabilecek parçalanmadır (işlem belleğinin).

+0

Sözcük/satır sınırlarıyla ne demek istediğinizi anladığımdan emin değilim. "CompressedFileStream" nesnesi, SevenZip dosyasının tüm dosyayı aldıktan sonra değil, akıştan dosya üstbilgisini aldığı anda döndürülür. Sıkıştırılmış dosya verilerinin okunması, kaynak akışının da ilerlemesine neden olur. – Yurik