Estoy tratando de descomprimir programáticamente un archivo comprimido.
Intenté usar la System.IO.Compression.GZipStream
clase en .NET, pero cuando se ejecuta mi aplicación (en realidad una prueba unitaria) obtengo esta excepción:
System.IO.InvalidDataException: el número mágico en el encabezado GZip no es correcto. Asegúrate de pasar una transmisión GZip
Ahora me doy cuenta de que un .zip
archivo no es lo mismo que un .gz
archivo, y que GZip
no es lo mismo que Zip
.
Sin embargo, dado que puedo extraer el archivo haciendo doble clic manualmente en el archivo comprimido y luego haciendo clic en el botón "Extraer todos los archivos", creo que también debería haber una forma de hacerlo en el código.
Por lo tanto, he tratado de usar Process.Start()
con la ruta al archivo comprimido como entrada. Esto hace que mi aplicación abra una ventana que muestra el contenido del archivo comprimido. Está bien, pero la aplicación se instalará en un servidor sin ninguno para hacer clic en el botón "Extraer todos los archivos".
Entonces, ¿cómo hago para que mi aplicación extraiga los archivos en los archivos comprimidos?
¿O hay otra forma de hacerlo? Prefiero hacerlo en código, sin descargar ninguna biblioteca o aplicación de terceros; al departamento de seguridad no le gusta mucho eso ...
Respuestas:
Hemos utilizado SharpZipLib con éxito en muchos proyectos. Sé que es una herramienta de terceros, pero el código fuente está incluido y podría proporcionar alguna información si decide reinventar la rueda aquí.
fuente
Con .NET 4.5 ahora puede descomprimir archivos usando .NET framework:
El código anterior se tomó directamente de la documentación de Microsoft: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
está contenido en la asambleaSystem.IO.Compression.FileSystem
. (Gracias nateirvin ... ver comentario más abajo)fuente
ZipFile
está contenido en el conjuntoSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. ¿Alguna idea sobre esto?Para .Net 4.5+
No siempre se desea escribir el archivo sin comprimir en el disco. Como desarrollador de ASP.Net, tendría que jugar con los permisos para otorgar derechos para que mi aplicación escriba en el sistema de archivos. Al trabajar con secuencias en la memoria, puedo evitar todo eso y leer los archivos directamente:
Alternativamente, aún puede escribir el archivo descomprimido en el disco llamando a
ExtractToFile()
:Para usar la
ZipArchive
clase, deberá agregar una referencia alSystem.IO.Compression
espacio de nombres y paraSystem.IO.Compression.FileSystem
.fuente
ZipArchive
objeto se ajusta muy bien.foreach
bucleExtractToFile
cuando solo puedo usar?ZipFile.ExtractToDirectory(inputFile, outputDir);
¿Cuál es la ventaja del primer método?Gratis y sin archivos DLL externos. Todo está en un archivo CS. Una descarga es solo el archivo CS, otra descarga es un ejemplo muy fácil de entender. Lo probé hoy y no puedo creer lo simple que fue la configuración. Funcionó en el primer intento, sin errores, sin nada.
https://github.com/jaime-olivares/zipstorer
fuente
Use la biblioteca DotNetZip en http://www.codeplex.com/DotNetZip
fuente
Para usar la clase ZipFile, debe agregar una referencia al ensamblado System.IO.Compression.FileSystem en su proyecto
fuente
Los archivos zip estándar normalmente usan el algoritmo de desinflado.
Para extraer archivos sin usar bibliotecas de terceros, use DeflateStream. Necesitará un poco más de información sobre el formato de archivo comprimido ya que Microsoft solo proporciona el algoritmo de compresión.
También puede intentar usar zipfldr.dll. Es la biblioteca de compresión de Microsoft (carpetas comprimidas del menú Enviar a). Parece ser una biblioteca de comunicaciones, pero no está documentada. Puede lograr que funcione para usted a través de la experimentación.
fuente
Lo uso para comprimir o descomprimir múltiples archivos. El material Regex no es obligatorio, pero lo uso para cambiar el sello de fecha y eliminar los guiones bajos no deseados. Uso la cadena vacía en la cadena Compress >> zipPath para anteponer algo a todos los archivos si es necesario. Además, generalmente comento Compress () o Decompress () en función de lo que estoy haciendo.
fuente
Esto lo hará
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
fuente
Desde aquí :
fuente
Puede hacerlo todo dentro de .NET 3.5 usando DeflateStream. Lo que falta en .NET 3.5 es la capacidad de procesar las secciones de encabezado de archivo que se utilizan para organizar los archivos comprimidos. PKWare ha publicado esta información, que puede utilizar para procesar el archivo zip después de crear las estructuras que se utilizan. No es particularmente oneroso, y es una buena práctica en la construcción de herramientas sin usar código de terceros.
No es una respuesta de una línea, pero es completamente factible si está dispuesto y puede tomarse el tiempo usted mismo. Escribí una clase para hacer esto en un par de horas y lo que obtuve de eso es la capacidad de comprimir y descomprimir archivos usando .NET 3.5 solo.
fuente
Me enteré de este (Descomprimir paquete en NuGet) hoy, ya que me encontré con un error grave en DotNetZip, y me di cuenta de que realmente no se ha hecho tanto trabajo en DotNetZip en los últimos dos años.
El paquete Unzip es sencillo, e hizo el trabajo por mí, no tenía el error que tenía DotNetZip. Además, era un archivo razonablemente pequeño, que confiaba en el BCL de Microsoft para la descompresión real. Podía hacer fácilmente los ajustes que necesitaba (para poder realizar un seguimiento del progreso mientras se descomprime). Lo recomiendo.
fuente
De recursos de inserción:
fuente
Hasta ahora, estaba usando procesos cmd para extraer un archivo .iso, copiarlo en una ruta temporal desde el servidor y extraerlo en un dispositivo USB. Recientemente descubrí que esto funciona perfectamente con .iso's que son menos de 10Gb. Para una iso como 29 Gb, este método se atasca de alguna manera.
fuente
puede usar la línea de comandos de Info-descomprimir cod. solo necesita descargar unzip.exe del sitio web oficial de Info-descomprimir.
fuente