2010-12-14 28 views
5

Estoy usando SharpZipLib para descomprimir archivos. Mi código ha estado trabajando muy bien para todos zipfiles excepto el archivo zip lo que estoy extracción de ahora ...SharpZipLib - ZipException "System.ArgumentOutOfRangeException" - ¿Por qué recibo esta excepción?

Tienes esta excepción:

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

La excepción está siendo lanzada a size = s.Read(data, 0, data.Length);

Hereb es mi código ...

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

Acabo de probar su ejemplo y está funcionando bien para mí. O bien el problema con el paquete zip o con la versión de la biblioteca. Utilicé 'v1.1.4322' –

+0

@Andrey: No existe tal versión de SharpZipLib, la última es 0.86. Creo que te confundes con el número de versión más largo para .NET 1.1. –

+0

Ah, claro, fue el valor de propiedad de la versión en tiempo de ejecución. Lo siento. La biblioteca es de la versión 0.84 –

Respuesta

5

Parece un error para mí. Afortunadamente, tiene acceso al código, por lo que debería poder ver exactamente dónde está yendo mal. Sugiero que construyas una versión de depuración de SharpZipLib, rompas la línea que arroja la excepción y echas un vistazo a lo que realmente está probando.

Debería estar bien leer en un buffer 2K incluso si no quedan 2K de datos.

(En realidad, no escribiría el código como lo hace, pero esa es una cuestión diferente. También lo movería a su propio método de utilidad; el acto de copiar todos los datos de una secuencia a otra es bastante común. No hay necesidad de atarlo a zip.)

+0

He comprobado todos los archivos y un archivo de 0 kb sql es la causa de esta excepción – bala3569

+0

Cómo solucionar esto – bala3569

+0

@ bala3569: Ya he sugerido que busque en el código y descubra dónde está el error. Entonces, puede corregir el error y enviarlo nuevamente a SharpZipLib. –

-1

Al observar el código, está leyendo el mismo conjunto de bytes nuevamente (y avanza la posición).

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

Un ejemplo de here muestra que el segundo argumento debe ser una posición de movimiento & no es un número fijo.

+0

@shahkalpesh: No, está leyendo datos diferentes, pero en el mismo búfer una y otra vez ... lo cual está bien, ya que el OP está * escribiendo * el búfer en otra secuencia. Está bien. –

+0

@Jon: ¿Entonces, el ejemplo en el enlace es incorrecto? Tenga en cuenta que la documentación es de 'System.IO.Stream' y no' ZipInputStream'. – shahkalpesh

+0

@shahkalpesh: Es correcto para lo que intenta hacer, que no es lo mismo que lo que el OP intenta hacer. –

-1

Cambie su código int size = 2048; a int size = data.Length;. No tomarás la excepción 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

Está tratando de usar una variable antes de que se haya declarado ('size'). Es cierto que en el código original, el valor inicial de 'size' ni siquiera se estaba usando ... pero cambiarlo a un valor inicial diferente no va a ayudar. –

Cuestiones relacionadas