2008-08-01 23 views

Respuesta

21

Siempre he usado la biblioteca SharpZip.

Here's a link

+0

Nota: Encontré un * int sobre flujo * error en el código de SharpZip hace años, que hizo que fallara en los archivos aleatorios que acababan de tener la combinación correcta de valores. No estoy seguro de si alguna vez se solucionó, pero desde la memoria cambié una variable 'int' por' long' en la fuente SharpZip para evitar el desbordamiento. * Tendré que intentar encontrar mi antiguo código fijo de SharpZip y verificar si coincide con el último *. –

6

Esto es muy fácil de hacer en Java, y como se mencionó anteriormente se puede llegar a las bibliotecas java.util.zip de C#. Para referencias ver:

java.util.zip javadocs
sample code

he usado esto hace un tiempo para hacer una cremallera profunda (recursivo) de una estructura de carpetas, pero no creo que he usado la descompresión. Si estoy tan motivado, puedo sacar ese código y editarlo aquí más tarde.

24

El espacio de nombres de estructura .Net 2.0 System.IO.Compression admite los algoritmos GZip y Deflate. Aquí hay dos métodos que comprimen y descomprimen una secuencia de bytes que puede obtener de su objeto de archivo. Puede sustituir GZipStream por DefaultStream en los métodos a continuación para usar ese algoritmo. Sin embargo, esto deja el problema de manejar archivos comprimidos con diferentes algoritmos.

public static byte[] Compress(byte[] data) 
{ 
    MemoryStream output = new MemoryStream(); 

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true); 
    gzip.Write(data, 0, data.Length); 
    gzip.Close(); 

    return output.ToArray(); 
} 

public static byte[] Decompress(byte[] data) 
{ 
    MemoryStream input = new MemoryStream(); 
    input.Write(data, 0, data.Length); 
    input.Position = 0; 

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true); 

    MemoryStream output = new MemoryStream(); 

    byte[] buff = new byte[64]; 
    int read = -1; 

    read = gzip.Read(buff, 0, buff.Length); 

    while (read > 0) 
    { 
     output.Write(buff, 0, read); 
     read = gzip.Read(buff, 0, buff.Length); 
    } 

    gzip.Close(); 

    return output.ToArray(); 
} 
8

Mi respuesta sería cerrar los ojos y optar por DotNetZip. Ha sido probado por una gran comunidad.

0

puede crear archivo zip con este método:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name) 
    { 
     var path = HostingEnvironment.MapPath(TempPath) + name; 
     await Task.Run(() => 
     { 
      if (File.Exists(path)) File.Delete(path); 
      ZipFile.CreateFromDirectory(sourceDirectoryPath, path); 
     }); 
     return path; 
    } 

y luego se puede descomprimir el archivo zip con estos métodos: el trabajo
1- este método con la ruta del archivo zip

public async Task ExtractZipFile(string filePath, string destinationDirectoryName) 
    { 
     await Task.Run(() => 
     { 
      var archive = ZipFile.Open(filePath, ZipArchiveMode.Read); 
      foreach (var entry in archive.Entries) 
      { 
       entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true); 
      } 
      archive.Dispose(); 
     }); 
    } 

2 - Este método funciona con la secuencia de archivo zip

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName) 
    { 
     string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue); 
     using (FileStream output = new FileStream(filePath, FileMode.Create)) 
     { 
      await zipFile.CopyToAsync(output); 
     } 
     await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName)); 
     await Task.Run(() => File.Delete(filePath)); 
    } 
Cuestiones relacionadas