net example descomprimir c# .net zip zipfile

example - Comprimir un solo archivo usando C#



ziparchive (5)

En .NET, hay bastantes formas de abordar el problema, para un solo archivo. Si no desea aprender todo allí, puede obtener una biblioteca abstraída, como SharpZipLib (biblioteca de código abierto de larga data), sevenzipsharp (requiere 7zip libs debajo) o DotNetZip.

Estoy usando .NET 4.5, y la clase ZipFile funciona muy bien si estoy tratando de comprimir un directorio completo con "CreateFromDirectory". Sin embargo, solo quiero comprimir un archivo en el directorio. Intenté apuntar a un archivo específico (carpeta / data.txt), pero eso no funciona. Consideré la clase ZipArchive ya que tiene un método "CreateEntryFromFile", pero parece que esto solo le permite crear una entrada en un archivo existente.

¿No hay manera de simplemente comprimir un archivo sin crear un archivo zip vacío (que tiene sus problemas) y luego usar el método "CreateEntryFromFile" de ZipArchiveExtension?

** Esto también implica que estoy trabajando en un programa de la compañía que no puede usar complementos de terceros en este momento.

ejemplo de: http://msdn.microsoft.com/en-us/library/ms404280%28v=vs.110%29.aspx

string startPath = @"c:/example/start"; string zipPath = @"c:/example/result.zip"; string extractPath = @"c:/example/extract"; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath);

Pero si startPath fuera @"c:/example/start/myFile.txt;" , arrojaría un error que el directorio no es válido.


La forma más sencilla de hacer que esto funcione es usar una carpeta temporal.

PARA EL ZIPPING:

  1. Crear una carpeta temporal
  2. Mover el archivo a la carpeta
  3. Carpeta zip
  4. Eliminar carpeta

PARA UNZIPPING:

  1. Descomprimir archivo
  2. Mueve el archivo de la carpeta temporal a tu ubicación
  3. Eliminar carpeta temporal

Usando el flujo de archivos (o cualquier otro):

using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create)) { var entry = zip.CreateEntry("file.txt"); entry.LastWriteTime = DateTimeOffset.Now; using (var stream= File.OpenRead(@"c:/path/to/file.txt")) using (var entryStream = entry.Open()) stream.CopyTo(entryStream); }

o más breve:

// reference System.IO.Compression using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create)) zip.CreateEntryFromFile("file.txt", "file.txt");

asegúrese de agregar referencias a System.IO.Compression


Use el CreateEntryFromFile de un archivo y use un archivo o flujo de memoria:

Usando un flujo de archivos si está bien creando el archivo zip y luego agregándolo:

using (FileStream fs = new FileStream(@"C:/Temp/output.zip",FileMode.Create)) using (ZipArchive arch = new ZipArchive(fs, ZipArchiveMode.Create)) { arch.CreateEntryFromFile(@"C:/Temp/data.xml", "data.xml"); }

O si necesita hacer todo en la memoria y escribir el archivo una vez que esté listo, use una secuencia de memoria:

using (MemoryStream ms = new MemoryStream()) using (ZipArchive arch = new ZipArchive(ms, ZipArchiveMode.Create)) { arch.CreateEntryFromFile(@"C:/Temp/data.xml", "data.xml"); }

Luego puedes escribir el MemoryStream en un archivo .

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) { byte[] bytes = new byte[ms.Length]; ms.Read(bytes, 0, (int)ms.Length); file.Write(bytes, 0, bytes.Length); ms.Close(); }


solo usa el siguiente código para comprimir un archivo.

public void Compressfile() { string fileName = "Text.txt"; string sourcePath = @"C:/SMSDBBACKUP"; DirectoryInfo di = new DirectoryInfo(sourcePath); foreach (FileInfo fi in di.GetFiles()) { //for specific file if (fi.ToString() == fileName) { Compress(fi); } } } public static void Compress(FileInfo fi) { // Get the stream of the source file. using (FileStream inFile = fi.OpenRead()) { // Prevent compressing hidden and // already compressed files. if ((File.GetAttributes(fi.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fi.Extension != ".gz") { // Create the compressed file. using (FileStream outFile = File.Create(fi.FullName + ".gz")) { using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress)) { // Copy the source file into // the compression stream. inFile.CopyTo(Compress); Console.WriteLine("Compressed {0} from {1} to {2} bytes.", fi.Name, fi.Length.ToString(), outFile.Length.ToString()); } } } } } }