Me gusta comprimir varios archivos que se crean dinámicamente en mi aplicación web. Esos archivos deben estar comprimidos. Para esto, no quiero usar ninguna herramienta de terceros. al igual que el uso de la API .NET en C#Cómo comprimir varios archivos utilizando solo .net api en C#
Respuesta
http://www.codeplex.com/DotNetZip códigos fuente están disponibles, para que pueda ver cómo lo hacen y escribir algo similar por sí mismo
Salida System.IO.Compression.DeflateStream. Encontrará un par de ejemplos en msdn http://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx
No estoy seguro de lo que quiere decir con no querer usar las herramientas de terceros, pero supongo que es que no quiere una interoperabilidad desagradable para programarlo a través de otra pieza de software.
recomiendo el uso de ICSharpCode SharpZipLib
Esto se puede agregar a su proyecto como un archivo DLL de referencia y es algo relativamente sencillo para la creación de archivos ZIP y leerlos.
SharpZipLib es bueno (+1) pero puede hacerlo de forma nativa en .Net ahora - vea la respuesta de @Ruben Bartelink – Keith
@Keith - solo si se ha movido a .Net 3.0+ – cjk
No lo hizo excluir .NET 3, y es apenas tan grande como forzar un movimiento de .NET 1.1 a 2.0 - Aunque SharpZipLib es una buena biblioteca que es muy utilizada (inc por mí) –
Use System.IO.Packaging in .NET 3.0+.
See this introduction to System.IO.Packaging
Si usted es capaz de tomar una dependencia .NET 4.5, hay una System.IO.Compression.ZipArchive en ese universo; vea walkthrough article here (via InfoQ news summary article here)
Solo una nota: esta es la API más fea que haya existido, para comprimir. – Cheeso
Siempre puede llamar a un ejecutable de un tercero como 7-zip con una línea de comando apropiada usando la clase System.Diagnostics.Process. No hay interoperación de esa manera porque solo le pides al SO que inicie un binario.
DotNetZip es el camino a seguir (dotnetzip.codeplex.com) ... no pruebes la librería .NET Packaging ... demasiado difícil de usar y me molesta el [Content_Types] .xml que pone allí.
Con el lanzamiento de .NET Framework 4.5 esto es realmente mucho más fácil ahora con las actualizaciones a System.IO.Compression que agrega ZipFile class. Hay un buen walk-through on codeguru; Sin embargo, los fundamentos están en línea con el siguiente ejemplo:
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.IO.Compression.FileSystem;
namespace ZipFileCreator
{
public static class ZipFileCreator
{
/// <summary>
/// Create a ZIP file of the files provided.
/// </summary>
/// <param name="fileName">The full path and name to store the ZIP file at.</param>
/// <param name="files">The list of files to be added.</param>
public static void CreateZipFile(string fileName, IEnumerable<string> files)
{
// Create and open a new ZIP file
var zip = ZipFile.Open(fileName, ZipArchiveMode.Create);
foreach (var file in files)
{
// Add the entry for each file
zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
}
// Dispose of the object when we are done
zip.Dispose();
}
}
}
¿Cómo hago esto al obtener los datos de los archivos (blob) de la base de datos? – Seth
@Seth, probablemente necesites hacer algunas E/S. Deserializar el blob de vuelta a bytes, escribir los bytes en el archivo, luego pasar la ruta completa del archivo en este método como uno de los archivos en los archivos 'IEnumerable
Bien se puede comprimir los archivos usando la función siguiente que ha de pasar sólo los bytes del archivo y esta función se zip los bytes del archivo pasado como parámetro y devuelve los bytes del archivo comprimido.
public static byte[] PackageDocsAsZip(byte[] fileBytesTobeZipped, string packageFileName)
{
try
{
string parentSourceLoc2Zip = @"C:\\\\UploadedDocs"\SG-ACA OCI Packages";
if (Directory.Exists(parentSourceLoc2Zip) == false)
{
Directory.CreateDirectory(parentSourceLoc2Zip);
}
//if destination folder already exists then delete it
string sourceLoc2Zip = string.Format(@"{0}\{1}", parentSourceLoc2Zip, packageFileName);
if (Directory.Exists(sourceLoc2Zip) == true)
{
Directory.Delete(sourceLoc2Zip, true);
}
Directory.CreateDirectory(sourceLoc2Zip);
FilePath = string.Format(@"{0}\{1}",
sourceLoc2Zip,
"filename.extension");//e-g report.xlsx , report.docx according to exported file
File.WriteAllBytes(FilePath, fileBytesTobeZipped);
//if zip already exists then delete it
if (File.Exists(sourceLoc2Zip + ".zip"))
{
File.Delete(sourceLoc2Zip + ".zip");
}
//now zip the source location
ZipFile.CreateFromDirectory(sourceLoc2Zip, sourceLoc2Zip + ".zip", System.IO.Compression.CompressionLevel.Optimal, true);
return File.ReadAllBytes(sourceLoc2Zip + ".zip");
}
catch
{
throw;
}
}
Ahora bien, si desea exportar esta bytes ZIP creados para que el usuario descarga puede llamar a esta función utilizando siguientes líneas
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=Report.zip");
Response.ContentType = "application/zip";
Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName"));
Response.End();
archivo zip simple con estructura plana:
using System.IO;
using System.IO.Compression;
private static void CreateZipFile(IEnumerable<FileInfo> files, string archiveName)
{
using (var stream = File.OpenWrite(archiveName))
{
using (ZipArchive archive = new ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Create))
{
foreach (var item in files)
{
archive.CreateEntryFromFile(item.FullName, item.Name, CompressionLevel.Optimal);
}
}
}
}
Necesita agregar referencia a System.IO.Compression y System.IO.Compression.FileSystem
- 1. Cómo comprimir varios archivos en un solo archivo con Delphi
- 2. ¿Cómo comprimir varios archivos en un zip con PowerShell?
- 3. descarga varios archivos como zip en .net
- 4. ¿Cómo puedo comprimir un directorio con .NET?
- 5. ftp subir varios archivos sin desconexión utilizando .NET
- 6. Comprimir archivos en partes en C#
- 7. Utilizando la misma variable en varios archivos en C++
- 8. ¿Mejor manera de comprimir archivos en Python (comprimir todo un directorio con un solo comando)?
- 9. SVN- cómo cometer varios archivos en un solo tiro
- 10. Concatenate varios archivos CSS en un solo
- 11. Numpy C API: Vincular varios archivos de objetos
- 12. Comprimir archivos en pitón
- 13. Cómo incluir varios archivos fuente en C#
- 14. Varios archivos adjuntos en C#
- 15. ¿Cómo puedo generar archivos y luego comprimir/comprimir con Heroku?
- 16. ¿Cómo comprimir solo archivos y no la jerarquía de ruta completa con DotNetZip en powershell?
- 17. ¿Combinar varios archivos binarios .NET juntos?
- 18. Cómo comprimir archivos usando JavaScript
- 19. ¿Comprimir múltiples archivos JavaScript con YUIcompressor?
- 20. ¿Cómo puedo "modificar" varios archivos en un solo archivo base?
- 21. ¿Cómo escribir archivos grandes en Blobstore utilizando la API experimental?
- 22. Cómo comprimir archivos en Windows utilizando solo lo que está incorporado (secuencia de comandos por lotes, explorador, etc.)?
- 23. Abrir varios archivos (OpenFileDialog, C#)
- 24. Cómo comprimir archivos de registro con NLog
- 25. Cómo comprimir varios archivos en un archivo GZip con la clase GZipStream?
- 26. Cómo comprimir y descomprimir los archivos?
- 27. Comprimir archivos Log4j
- 28. clases en varios archivos en C++
- 29. Cómo incluir varios archivos Javascript en .NET (como lo hacen en los rieles)
- 30. ¿Cómo puedo generar C wrappers sobre API C++ utilizando SWIG?
Deflate is no ZIP. También hay GZipStream pero tampoco es ZIP. – Ray
cierto, pero aún puede comprimir varios archivos para enviar. Sarathi pidió algo incorporado en .net.Y eso es algo que .net ofrece – Marcom