2010-06-18 18 views
7

Tengo un código que descarga archivos comprimidos y los descomprime. El problema es que no puedo hacer que descomprima todo el archivo, solo lee los primeros 4096 bytes y luego unos 500 más.GZipStream no lee todo el archivo

Byte[] buffer = new Byte[4096]; 
int count = 0; 
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read); 
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None); 
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true); 

// Read from gzip steam 
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    // Write to output file 
    fileOutput.Write(buffer, 0, count); 
} 

// Close the streams 
... 

He comprobado el archivo descargado; es 13MB cuando está comprimido, y contiene un archivo XML. He descomprimido manualmente el archivo XML, y el contenido está allí. Pero cuando lo hago con este código, solo muestra el comienzo del archivo XML.

¿Alguien tiene alguna idea de por qué esto podría estar pasando?

+0

Recuerdo haber recibido este problema cuando estaba escribiendo una rutina de descompresión. Sin embargo, he buscado el código de trabajo con el que terminé y se parece al tuyo además de estar envuelto en bloques 'using'. –

+3

¿Está llamando a un método Flush()? – n535

+0

Probado con Flush(), no ayudó. – Edgar

Respuesta

1

Terminé usando un ejecutable gzip para hacer la descompresión en lugar de un GZipStream. No puede manejar el archivo por alguna razón, pero el ejecutable puede.

+0

¿Podría publicar su versión final, por favor? Me gustaría ver exactamente cómo usas el ejecutable gzip. – ManInMoon

+0

Lo siento, ya no tengo acceso al código. Usó la clase Process para llamar al ejecutable de gzip. Esto podría ayudar: http://www.dotnetperls.com/7-zip – Edgar

4

EDITAR

Trate de no dejar la GZipStream abierta:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, 
                     false); 

o

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress); 
+0

Sí, probé CopyTo(). El resultado es el mismo. No tengo idea de por qué no puede leer más de lo que lo hace. – Edgar

+0

Probado con el uso de declaraciones; ningún cambio. – Edgar

+0

Intentó no dejar abierto el GZipStream; ningún cambio. – Edgar

0

son usted que llama Close o Flush en fileOutput? (O simplemente envuélvalo en un using, que es la práctica recomendada). Si no lo hace, es posible que el archivo no se vacíe en el disco cuando finalice su programa.

+0

Las 3 transmisiones se cierran después de terminar la lectura. El problema no es que los datos no se escriben correctamente en el archivo de salida, sino que Read() no lee todo el archivo de entrada. ¿Podría algo estar interrumpiéndolo? Lee el número exacto de bytes cada vez que se detiene, lo cual es curioso. – Edgar

+0

¿Cuál es el valor de 'count' después de la primera lectura? –

+0

Después de la primera lectura, es 4096, la segunda lectura es 532 y luego se detiene. – Edgar

1

Lo mismo me ha pasado a mí. En mi caso, solo lee hasta 6 líneas y luego llega al final del archivo. Entonces me di cuenta de que, aunque la extensión es gz, fue comprimida por otro algoritmo no soportado por GZipStream. Entonces usé la biblioteca SevenZipSharp y funcionó. Este es mi código

Usted puede usar la biblioteca SevenZipSharp

using (var input = File.OpenRead(lstFiles[0])) 
{ 
    using (var ds = new SevenZipExtractor(input)) 
    { 
     //ds.ExtractionFinished += DsOnExtractionFinished; 

     var mem = new MemoryStream(); 
     ds.ExtractFile(0, mem); 

     using (var sr = new StreamReader(mem)) 
     { 
      var iCount = 0; 
      String line; 
      mem.Position = 0; 
      while ((line = sr.ReadLine()) != null && iCount < 100) 
      { 
       iCount++; 
       LstOutput.Items.Add(line); 
      } 

     } 
    } 
} 
Cuestiones relacionadas