net - ¿Cómo descomprimir todo el archivo.Zip de la carpeta usando C#4.0 y sin usar ninguna DLL de OpenSource?
using zipfile zip new zipfile()) (7)
Tengo una carpeta que contiene archivos .ZIP . Ahora, quiero extraer los archivos ZIP a carpetas específicas usando C #, pero sin usar ningún ensamblaje externo o .Net Framework 4.5.
He buscado, pero no he encontrado ninguna solución para desempaquetar archivos * .zip utilizando Framework 4.0 o inferior.
Intenté con GZipStream, pero solo admite archivos .gz y no .zip.
.NET 3.5 tiene un DeflateStream para esto. Debe crear estructuras para la información en los directorios y demás, pero PKWare ha publicado esta información. He escrito una utilidad de descompresión y no es particularmente onerosa una vez que creas las estructuras para ella.
En .net 4.0 Deflate y GZip no pueden manejar archivos Zip, pero puede usar la función de shell para descomprimir archivos.
public FolderItems Extract()
{
var shell = new Shell();
var sf = shell.NameSpace(_zipFile.Path);
return sf.Items();
}
Cuando se llama a la función de extracción, puede guardar los elementos de carpeta devueltos por
FolderItems Fits = Extract();
foreach( var s in Fits)
{
shell.Namespace("TargetFolder").copyhere(s);
}
Tuve el mismo problema y lo resolví llamando al ejecutable 7-zip a través del shell cmd desde el código C #, de la siguiente manera:
string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;
System.Diagnostics.Process process
= Launch_in_Shell("C://Program Files (x86)//7-Zip//","7z.exe", arguments);
if (!(process.ExitCode == 0))
throw new Exception("Unable to decompress file: " + zipped_path);
Y donde Launch_in_Shell(...)
se define como,
public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
string FileName,
string Arguments)
{
System.Diagnostics.ProcessStartInfo processInfo
= new System.Diagnostics.ProcessStartInfo();
processInfo.WorkingDirectory = WorkingDirectory;
processInfo.FileName = FileName;
processInfo.Arguments = Arguments;
processInfo.UseShellExecute = true;
System.Diagnostics.Process process
= System.Diagnostics.Process.Start(processInfo);
return process;
}
Inconvenientes: necesita tener 7zip instalado en su máquina y solo lo probé con archivos ".7z". Espero que esto ayude.
Tuve la misma pregunta y encontré un gran artículo muy simple que resuelve el problema. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/
deberá hacer referencia a la biblioteca COM llamada Microsoft Shell Controls And Automation (Interop.Shell32.dll)
El código (tomado sin tocar del artículo para que veas lo sencillo que es):
public static void UnZip(string zipFile, string folderPath)
{
if (!File.Exists(zipFile))
throw new FileNotFoundException();
if (!Directory.Exists(folderPath))
Directory.CreateDirectory(folderPath);
Shell32.Shell objShell = new Shell32.Shell();
Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
Shell32.Folder sourceFile = objShell.NameSpace(zipFile);
foreach (var file in sourceFile.Items())
{
destinationFolder.CopyHere(file, 4 | 16);
}
}
Recomiendo encarecidamente leer el artículo: trae una explicación para las banderas 4 | 16
EDITAR: después de varios años que mi aplicación, que usa esto, ha estado funcionando, recibí quejas de dos usuarios que de repente dejaron de funcionar. parece que la función CopyHere crea archivos / carpetas temporales y estos nunca se eliminaron, lo que causó problemas. La ubicación de estos archivos se puede encontrar en System.IO.Path.GetTempPath ().
puedes usar DotNetZip (código abierto) `
string zipFilePath = "C://sample.zip";
string extractedFilePath = "C://sampleFolder";
ZipFile zipfile = ZipFile.Read(zipFilePath);
if (!Directory.Exists(extractedFilePath))
Directory.CreateDirectory(extractedFilePath);
foreach (ZipEntry e in zipfile)
{
e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`
ZipPackage podría ser un lugar para comenzar. Está dentro de System.IO.Packaging y está disponible en .NET 4.0
No se acerca a la simplicidad del método .NET 4.5 mencionado anteriormente, pero parece que puede hacer lo que quiera.
Aquí hay un ejemplo de msdn . System.IO.Compression.ZipFile
está hecho solo para eso:
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string startPath = @"c:/example/start";
string zipPath = @"c:/example/result.zip";
string extractPath = @"c:/example/extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
}
}
}
Edición: lo siento, me perdí que estés interesado en .NET 4.0 y más abajo. Requiere .NET framework 4.5 y superior.