c# ziparchive gzipstream - ¿Cómo puedo ZIP un archivo en C #, sin API de terceros?




4 Answers

¿Estás usando .NET 3.5? Puede usar la clase ZipPackage y las clases relacionadas. Es más que simplemente descomprimir una lista de archivos porque quiere un tipo MIME para cada archivo que agregue. Puede hacer lo que quieras.

Actualmente estoy usando estas clases para un problema similar para archivar varios archivos relacionados en un único archivo para descargar. Usamos una extensión de archivo para asociar el archivo de descarga con nuestra aplicación de escritorio. Un pequeño problema que encontramos fue que no es posible usar una herramienta de terceros como 7-zip para crear los archivos zip porque el código del lado del cliente no puede abrirlo. ZipPackage agrega un archivo oculto que describe el tipo de contenido de cada archivo de componente y no puede abrir un archivo zip si falta ese archivo de tipo de contenido.

example descomprimir

Estoy bastante seguro de que esto no es un duplicado, así que tengan paciencia conmigo por solo un minuto.

¿Cómo puedo programar (C #) ZIP un archivo (en Windows) sin utilizar ninguna biblioteca de terceros? Necesito una llamada de Windows nativa o algo así; Realmente no me gusta la idea de comenzar un proceso, pero lo haré si es absolutamente necesario. Una llamada PInovke sería mucho mejor.

De lo contrario, permítame decirle lo que realmente estoy tratando de lograr: necesito la capacidad de permitir que un usuario descargue una colección de documentos en una sola solicitud. ¿Alguna idea sobre cómo lograr esto?




Estaba en la misma situación, queriendo .NET en lugar de una biblioteca de terceros. Como otro cartel mencionado anteriormente, simplemente usar la clase ZipPackage (introducido en .NET 3.5) no es suficiente. Hay un archivo adicional que DEBE incluirse en el archivo para que el ZipPackage funcione. Si se agrega este archivo, el paquete ZIP resultante se puede abrir directamente desde el Explorador de Windows, no hay problema.

Todo lo que tiene que hacer es agregar el archivo [Content_Types] .xml a la raíz del archivo con un nodo "Predeterminado" para cada extensión de archivo que desee incluir. Una vez agregado, podría examinar el paquete desde el Explorador de Windows o descomprimir y leer sus contenidos mediante programación.

Puede encontrar más información sobre el archivo [Content_Types] .xml aquí: http://msdn.microsoft.com/en-us/magazine/cc163372.aspx

Aquí hay una muestra del archivo [Content_Types] .xml (debe nombrarse exactamente):

<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns=
    "http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="text/xml" /> 
  <Default Extension="htm" ContentType="text/html" /> 
  <Default Extension="html" ContentType="text/html" /> 
  <Default Extension="rels" ContentType=
    "application/vnd.openxmlformats-package.relationships+xml" /> 
  <Default Extension="jpg" ContentType="image/jpeg" /> 
  <Default Extension="png" ContentType="image/png" /> 
  <Default Extension="css" ContentType="text/css" /> 
</Types>

Y el C # para crear un archivo ZIP:

var zipFilePath = "c:\\myfile.zip"; 
var tempFolderPath = "c:\\unzipped"; 

    using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) 
    { 
        foreach (PackagePart part in package.GetParts()) 
        { 
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); 
            var targetDir = target.Remove(target.LastIndexOf('\\')); 

            if (!Directory.Exists(targetDir)) 
                Directory.CreateDirectory(targetDir); 

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) 
            { 
                source.CopyTo(File.OpenWrite(target)); 
            } 
        } 
    } 

Nota:




    private static string CompressFile(string sourceFileName)
    {
        using (ZipArchive archive = ZipFile.Open(Path.ChangeExtension(sourceFileName, ".zip"), ZipArchiveMode.Create))
        {
            archive.CreateEntryFromFile(sourceFileName, Path.GetFileName(sourceFileName));
        }
        return Path.ChangeExtension(sourceFileName, ".zip");
    }



Parece que Windows podría dejarte hacer this ...

Lamentablemente, no creo que vayas a mover un proceso por separado a menos que vayas a un componente de un tercero.




Related