2014-12-22 13 views
9

Tôi đang sử dụng để trích xuất Ionic.Zip ZipFile để dòng ký ức với phương pháp này:đọc Zip ion như Memory Suối C#

private MemoryStream GetReplayZipMemoryStream() 
{ 
    MemoryStream zipMs = new MemoryStream(); 
    using (ZipFile zip = ZipFile.Read(myFile.zip)) 
    { 
     foreach (ZipEntry zipEntry in zip) 
     { 
      if (zipEntry.FileName.StartsWith("Aligning") || zipEntry.FileName.StartsWith("Sensing")) 
      { 
       zipEntry.Extract(zipMs); 
      } 
     } 
    } 

    zipMs.Seek(0, SeekOrigin.Begin); 
    return zipMs; 
} 

Khi tôi đang thực hiện giải nén, tôi muốn đọc những dòng suối và nhận được một số mục nhập dựa trên tên tệp nhập. Làm thế nào tôi có thể làm điều đó?

tôi đã cố gắng bằng cách gọi với mã dưới đây, nhưng tôi nhận được lỗi trên ZipFile.Read(ms) mà nói:

Không thể đọc mà như một ZipFile

Stream ms = GetReplayZipMemoryStream(); 
using (ZipFile zip = ZipFile.Read(ms)) 
{ 
    ZipEntry imageEntry = zip.Entries.First(x => x.FileName.EndsWith(".png")); 
    using (Stream s = imageEntry.OpenReader()) 
    { 
     var image = Image.FromStream(s); 
     pictureBox1.Image = image; 
    } 
} 

Cảm ơn bạn trước cho Cứu giúp!

+5

Sau khi bạn đã thực hiện '.Extract() 'dữ liệu (trong dòng mem) không còn được nén ... Bạn có một serie các tập tin không nén được nối. –

+0

Như Henk Holterman gợi ý, trừ khi bạn đang xử lý các tệp zip lồng nhau, bạn không nên giải nén các tệp một lần nữa trong đoạn thứ hai. Bạn có thể cung cấp cấu trúc mẫu của các tệp bạn đang cố gắng giải nén không? Ngoài ra tôi khuyên bạn nên làm tất cả các bộ lọc trong vòng đầu tiên và thậm chí có thể tạo ra hình ảnh đó, để không viết tất cả các tập tin bạn muốn đọc, vào một dòng duy nhất. –

+2

Ngoài các Henk quan sát được thực hiện, tôi sẽ đề nghị bạn không sử dụng Ionic.Zip để làm điều này anyway. .NET hiện có lớp 'ZipArchive', cung cấp chức năng tích hợp để xử lý các tệp .zip, và IMHO nào thuận tiện hơn mã bạn đã có bây giờ. –

Trả lời

0

@HenkHolerman là đúng, bạn không còn có tệp zip tại thời điểm đó nữa. Bạn có thể muốn xem xét giải nén nội dung của tệp nén vào một thư mục tạm thời, và sau đó thao tác trên các tệp hình ảnh thông qua hệ thống tệp.

11

Đây có thể là ít câu hỏi cũ bit và câu trả lời cuối nhưng tôi đã làm điều gì để có được các tập tin như byte bộ sưu tập và tên tập tin của nó như thế này

public static Dictionary<string, byte[]> Decompress(Stream targFileStream) 
{ 
    Dictionary<string, byte[]> files = new Dictionary<string, byte[]>(); 

    using(ZipFile z = ZipFile.Read(targFileStream)) 
    { 
     foreach (ZipEntry zEntry in z) 
     { 
      MemoryStream tempS = new MemoryStream(); 
      zEntry.Extract(tempS); 

      files.Add(zEntry.FileName, tempS.ToArray()); 
     } 
    } 

    return files; 
} 
+0

Cảm ơn. Tôi đã tìm kiếm điều này. Tôi đã không nhìn vào hàm Extract() ảo khác nhau. –