varios net example comprimir archivos .net zipfile

example - System.IO.Compression.ZipFile.NET 4.5 salida zip in no es adecuado para Linux/Mac/Java



ziparchive c# (3)

La solución correcta para este problema es la siguiente

class MyEncoder : UTF8Encoding { public MyEncoder() : base(true) { } public override byte[] GetBytes(string s) { s = s.Replace("//", "/"); return base.GetBytes(s); } }

NOTA: Esto es ligeramente diferente de una respuesta anterior.

La diferencia clave está en : base(true)

Esto es importante o la clase .NET ZipArchive NO reconocerá el codificador como un codificador UTF-8 y NO marcará el bit de propósito general correcto, y así extraer el archivo zip resultante con cualquier otro programa zip supondrá que el nombre de la entrada zip está en una codificación no Unicode que podría resultar en un nombre de archivo mutilado.

El motivo se debe a una llamada interna en .NET para verificar si el codificador personalizado es .equals(Encoding.UTF8) que no es verdadero a menos que se pase true para el codificador ShouldEmitUTF8Identifier like Encoding.UTF8

Mientras se usa la clase .NET System.IO.Compression.ZipFile.CreateFromDirectory , el archivo zip resultante se extrae mal en el sistema con el separador de directorio de barra diagonal.

Motivo: El zip contiene una barra invertida dentro de los nombres.


Microsoft ha abordado esto en .NET 4.6.1 :

A partir de las aplicaciones que apuntan a .NET Framework 4.6.1, el separador de ruta utilizado en la propiedad ZipArchiveEntry.FullName ha cambiado de la barra invertida ("/") utilizada en versiones anteriores de .NET Framework a una barra diagonal ("/" ). Los objetos System.IO.Compression.ZipArchiveEntry se crean llamando a una de las sobrecargas del método ZipFile.CreateFromDirectory.

Nota:

Además, las aplicaciones que apuntan a versiones anteriores de .NET Framework pero que se ejecutan en .NET Framework 4.6.1 y versiones posteriores pueden participar en este comportamiento agregando una configuración de configuración a la sección del archivo de configuración de la aplicación.


Para superar este problema existe una solución:

class MyEncoder : UTF8Encoding { public MyEncoder() { } public override byte[] GetBytes(string s) { s = s.Replace("//", "/"); return base.GetBytes(s); } } System.IO.Compression.ZipFile.CreateFromDirectory("C:/ABC", "C:/tmp/ABC.zip", CompressionLevel.Fastest, false, new MyEncoder());