2010-12-14 65 views
5

我正在使用SharpZipLib解压缩文件。我的代码已经被很好地工作,除了为zip文件都zipfiles我现在所提取...SharpZipLib - ZipException“System.ArgumentOutOfRangeException” - 为什么我得到这个异常?

得到这个异常:

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

异常正以size = s.Read(data, 0, data.Length);

抛出Hereb是我的代码...

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

我刚刚试过你的例子,它对我的​​工作很好。 无论是zip包还是库版本问题。 我使用'v1.1.4322' – 2010-12-14 07:21:41

+0

@Andrey:没有这样的SharpZipLib版本 - 最新版本是0.86。我认为你对.NET 1.1的更长版本号感到困惑。 – 2010-12-14 07:38:44

+0

啊,对,它是运行时版本属性值。抱歉。 库的版本是0.84 – 2010-12-14 07:53:10

回答

5

看起来像一个bug给我。幸运的是,您可以访问代码,因此您应该能够准确查看错误发生的位置。我建议你构建一个SharpZipLib的调试版本,在引发异常的那一行中断,并且看看它实际正在测试的内容。

即使没有2K的数据,也应该可以读入2K缓冲区。我不会真的写代码,但是这是另一回事,我也将它移到它自己的实用方法中 - 将所有数据从一个流复制到另一个流的过程非常漂亮不需要将其绑定到zip)

+0

我已经检查过所有的文件,并且一个0 kb的sql文件是导致这个异常的原因 – bala3569 2010-12-14 09:22:30

+0

如何解决这个问题 – bala3569 2010-12-14 09:46:26

+0

@ bala3569:我已经建议你查看代码并找出bug的位置。然后,您可以修复该错误并将其提交回SharpZipLib。 – 2010-12-14 09:55:02

-1

看着代码,你再次读取同一组字节(并推进位置)。

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

here一个例子示出了第二参数应该是一个移动位置&不是一个固定的数目。

+0

@shahkalpesh:不,它正在读取不同的数据,但一次又一次地进入相同的缓冲区......这是好的,因为OP然后*将缓冲区写出到另一个流。没关系。 – 2010-12-14 07:07:29

+0

@Jon:那么,链接上的示例不正确?请注意,文档是'System.IO.Stream'而不是'ZipInputStream'。 – shahkalpesh 2010-12-14 07:25:37

+0

@shahkalpesh:它正在尝试做什么是正确的,这与OP正在尝试做的不一样。 – 2010-12-14 07:29:16

-1

将代码int size = 2048;更改为int size = data.Length;。你不会采取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

您正在尝试在声明变量('size')之前使用变量。诚然,在原始代码中,'size'的初始值甚至没有被使用...但是将其改为不同的初始值不会有帮助。 – 2010-12-14 07:30:26

相关问题