2012-08-08 40 views
5

Trong C#, tôi đang sử dụng DotNetZip Tôi có một mã zip "innerZip.zip" chứa một số dữ liệu, và một mã zip khác có tên là "outerZip.zip" có chứa innerZip. tại sao tôi làm như thế này? tốt, khi đặt mật khẩu, mật khẩu thực sự áp dụng cho các mục nhập riêng lẻ được thêm vào lưu trữ chứ không phải toàn bộ lưu trữ, bằng cách sử dụng tổ hợp bên trong/bên ngoài này, Tôi có thể đặt mật khẩu cho toàn bộ zip bên trong vì đó là mục nhập của bên ngoài.Nhận ngoại lệ "Không thể đọc đó dưới dạng tệp Zip" khi cố gắng lấy luồng từ Tệp zip bên trong (một Zip trong một Zip khác)

Vấn đề là, tốt, mã nói tốt hơn lời nói bình thường:

ZipFile outerZip = ZipFile.Read("outerZip.zip"); 
outerZip.Password = "VeXe"; 
Stream innerStream = outerZip["innerZip.zip"].OpenReader(); 
ZipFile innerZip = ZipFile.Read(innerStream); // I'm getting the exception here. 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 

lý do tại sao tôi nhận được ngoại lệ đó? tệp bên trong là tệp zip, vì vậy tôi không nên nhận ngoại lệ đó phải không? là có một cách để có được xung quanh này hoặc tôi chỉ cần giải nén bên trong từ bên ngoài, và sau đó truy cập nó?

Thanx trước ..

Trả lời

6

ngoại lệ này xảy ra vì dòng CrcCalculatorStream rằng OpenReader tạo ra là không seekable, và ZipFile.Read(Stream) cố gắng để tìm kiếm trong khi mở file zip.

Tính chất nén zip ngăn không cho tìm kiếm vị trí trong nội dung nén, nội dung phải được giải nén theo thứ tự.

Một cách xung quanh việc này là trích xuất tệp zip bên trong thành MemoryStream và sau đó tải thông qua ZipFile.Read.

MemoryStream ms = new MemoryStream(); 
outerZip["innerZip.zip"].Extract(ms); 
ms.Seek(0, SeekOrigin.Begin); 
ZipFile innerZip = ZipFile.Read(ms); 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 
+1

Tôi biết bài đăng này hơi lỗi thời. Nhưng cảm ơn bạn về mẹo! Nó đã cứu một đồng nghiệp của tôi giờ khó chơi! +1 –

Các vấn đề liên quan