2010-12-14 35 views
5

Tôi đang sử dụng SharpZipLib để giải nén tệp. Mã của tôi đã được làm việc độc đáo cho tất cả zipfiles trừ file zip gì tôi đang giải nén bây giờ ...SharpZipLib - ZipException "System.ArgumentOutOfRangeException" - Tại sao tôi nhận được ngoại lệ này?

Got ngoại lệ này:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. 
Parameter name: length 

Trường hợp ngoại lệ được ném vào size = s.Read(data, 0, data.Length);

Hereb là của tôi mã ...

public static void UnzipFile(string sourcePath, string targetDirectory) 
    { 
     try 
     { 
      using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourcePath))) 
      { 
       ZipEntry theEntry; 
       while ((theEntry = s.GetNextEntry()) != null) 
       { 
        //string directoryName = Path.GetDirectoryName(theEntry.Name); 
        string fileName = Path.GetFileName(theEntry.Name); 

        if (targetDirectory.Length > 0) 
        { 
         Directory.CreateDirectory(targetDirectory); 
        } 

        if (fileName != String.Empty) 
        { 
         using (FileStream streamWriter = File.Create(targetDirectory + fileName)) 
         { 
          int size = 2048; 
          byte[] data = new byte[2048]; 
          while (true) 
          { 
           size = s.Read(data, 0, data.Length); 
           if (size > 0) 
           { 
            streamWriter.Write(data, 0, size); 
           } 
           else 
           { 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Error unzipping file \"" + sourcePath + "\"", ex); 
     } 
    } 
+0

Tôi vừa thử ví dụ của bạn và làm việc tốt cho tôi. Sự cố với gói zip hoặc với phiên bản thư viện. Tôi đã sử dụng 'v1.1.4322' –

+0

@Andrey: Không có phiên bản SharpZipLib như vậy - phiên bản mới nhất là 0,86. Tôi nghĩ bạn đang bối rối với số phiên bản dài hơn cho .NET 1.1. –

+0

Ah, phải, nó là giá trị thuộc tính phiên bản thời gian chạy. Lấy làm tiếc. Thư viện có phiên bản 0.84 –

Trả lời

5

Trông giống như một lỗi đối với tôi. May mắn thay, bạn có quyền truy cập vào mã, vì vậy bạn sẽ có thể thấy chính xác nơi nó đang đi sai. Tôi đề nghị bạn xây dựng một phiên bản gỡ lỗi của SharpZipLib, phá vỡ trên dòng đó là ném ngoại lệ, và có một cái nhìn vào những gì nó thực sự thử nghiệm.

Bạn nên đọc bộ đệm 2K ngay cả khi không còn 2K dữ liệu.

(Tôi thực sự không viết mã hoàn toàn như thế nào, nhưng đó là một vấn đề khác. Tôi cũng sẽ chuyển nó thành phương thức tiện ích riêng của mình - hành động sao chép tất cả dữ liệu từ luồng này sang luồng khác thông thường. Không cần phải buộc nó vào mã zip.)

+0

Tôi đã kiểm tra tất cả các tệp và tệp sql 0 kb là nguyên nhân của ngoại lệ này – bala3569

+0

Cách sửa lỗi này – bala3569

+0

@ bala3569: Tôi đã đề xuất bạn xem mã và tìm ra lỗi ở đâu. Sau đó bạn có thể sửa lỗi và gửi lại cho SharpZipLib. –

-1

Nhìn mã, bạn đang đọc cùng một bộ byte một lần nữa (và tiến lên vị trí).

size = s.Read(data, 0, data.Length);

Một ví dụ từ here cho thấy rằng đối số thứ 2 phải là một vị trí di chuyển & không phải là một số cố định.

+0

@shahkalpesh: Không, nó đọc dữ liệu khác nhau, nhưng vào cùng một bộ đệm lặp đi lặp lại ... điều đó là tốt, vì OP sau đó sẽ * ghi ra * bộ đệm cho luồng khác. Tốt rồi. –

+0

@Jon: Vì vậy, ví dụ về liên kết không chính xác? Xin lưu ý rằng tài liệu là 'System.IO.Stream' và không phải là' ZipInputStream'. – shahkalpesh

+0

@shahkalpesh: Đó là chính xác cho những gì nó đang cố gắng làm, mà không giống như những gì OP đang cố gắng làm. –

-1

Thay đổi mã của bạn int size = 2048; thành int size = data.Length;. Bạn sẽ không có ngoại lệ OutOfRange.

using (FileStream streamWriter = File.Create(targetDirectory + fileName)) 
    { 
     int size = data.Length; 
     byte[] data = new byte[size]; 
     while (true) 
     { 
      size = s.Read(data, 0, data.Length); 
      if (size > 0) 
      { 
       streamWriter.Write(data, 0, size); 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
+0

Bạn đang cố gắng sử dụng biến trước khi được khai báo ('size'). Phải thừa nhận rằng trong mã ban đầu, giá trị ban đầu của 'kích thước' thậm chí không được sử dụng ... nhưng việc thay đổi nó thành giá trị ban đầu khác sẽ không giúp ích gì. –

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