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