2009-10-17 12 views
8

que tienen código que debe hacer la compresión:GZipStream y descompresión

 FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open); 
     FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create); 
     GZipStream csStream = new GZipStream(fd, CompressionMode.Compress); 


     byte[] compressedBuffer = new byte[500]; 
     int offset = 0; 
     int nRead; 

     nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length); 
     while (nRead > 0) 
     { 
      csStream.Write(compressedBuffer, offset, nRead); 
      offset = offset + nRead; 
      nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length); 
     } 


     fd.Close(); 
     fs.Close(); 

y yo creo que sí, pero yo quiero para descomprimir lo que se comprime la forma anterior. Yo somethink así:

 FileStream fd = new FileStream("g:\\gj.new", FileMode.Create); 
     FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open); 
     GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress); 

     byte[] decompressedBuffer = new byte[500]; 
     int offset = 0; 
     int nRead; 

     nRead=csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length); 
     while (nRead > 0) 
     { 
      fd.Write(decompressedBuffer, offset, nRead); 
      offset = offset + nRead; 
      nRead = csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length); 
     } 

     fd.Close(); 
     fs.Close(); 

y aquí no ... Tengo nLea = 0 befeore entrar en el bucle ... Lo que hago mal ?? El archivo de prueba que uso es el archivo TEXT más simple (tamaño: 104 bytes) ...

+0

respuesta Editado para mostrar tanto leer y escribir –

+5

Nótese también que gzip = ".zip" –

+0

(tenga en cuenta que ha corregido un error después de la publicación;! Cheack que tanto 'while' solo hace' Read' en la línea superior (no en la parte inferior) –

Respuesta

13

Mi primer pensamiento es que no ha cerrado csStream. Si usa using, esto sucede automáticamente. Dado que gzip almacena datos de manera temporal, es posible que falte algo.

En segundo lugar; no incremente offset; ese es el desplazamiento en el buffer (no la secuencia). Deje en 0:

using (Stream fs = File.OpenRead("gj.txt")) 
using (Stream fd = File.Create("gj.zip")) 
using (Stream csStream = new GZipStream(fd, CompressionMode.Compress)) 
{ 
    byte[] buffer = new byte[1024]; 
    int nRead; 
    while ((nRead = fs.Read(buffer, 0, buffer.Length))> 0) 
    { 
     csStream.Write(buffer, 0, nRead); 
    } 
} 

using (Stream fd = File.Create("gj.new.txt")) 
using (Stream fs = File.OpenRead("gj.zip")) 
using (Stream csStream = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    byte[] buffer = new byte[1024]; 
    int nRead; 
    while ((nRead = csStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fd.Write(buffer, 0, nRead); 
    } 
} 
+0

El problema es que la compresión funciona bien, pero no puedo descomprimir –

+0

¡Funciona! ¡Gracias! –

+4

En lugar de bucle de búfer también puede usar la función incorporada. Copiar a(). En este caso sería: csStream.CopyTo (fd); –

-1

Los dos métodos que tengo son como James Roland mencionó.

private static byte[] Compress(HttpPostedFileBase file) 
{ 
    var to = new MemoryStream(); 
    var from = new GZipStream(to, CompressionMode.Compress); 
    file.InputStream.CopyTo(from); 
    from.Close(); 
    return to.ToArray(); 
} 

private byte[] Decompress(byte [] img) 
{ 
    var to = new MemoryStream(); 
    var from = new MemoryStream(img); 
    var compress = new GZipStream(from, CompressionMode.Decompress); 
    compress.CopyTo(to); 
    from.Close(); 
    return to.ToArray(); 
} 

Sin embargo, estoy usando un proceso de carga con

Request.Files[0] 

continuación, comprimir y guardar en el PP. Entonces me tire de la img cabo, descomprimir y establecer un src con

$"data:image/gif;base64,{ToBase64String(Decompress(img))}"; 
+0

¡Nunca use un objeto 'IDisposable' sin' usar'! –

Cuestiones relacionadas