Saltar al contenido

como evitar [Content_Types].xml en la clase ZipPackage de .net

La guía o código que hallarás en este artículo es la resolución más fácil y válida que hallamos a esta inquietud o problema.

Solución:

No.

Los paquetes Zip no son archivos Zip (normales). Deben seguir una estructura impuesta y contener que Content_Types.xml archivo en la raíz. ZipPackage = ZipArchive + Structure.

Si desea crear (y especialmente si desea leer) archivos Zip normales, necesitará una biblioteca adicional, no hay soporte en BCL.

Ver SharpZipLib (GPL) y DotNetZip

Si no llama al método .Flush(), no habrá tal archivo

Sí, puede crear paquetes zip sin agregar el archivo de contenido XML adicional

Inspirado en este enlace: Uso de System.IO.Packaging para generar un archivo ZIP

Usando el descubrimiento anterior mencionado por Yiping, puede evitar el archivo xml adicional agregado al paquete. Guarde el flujo zip del flujo de memoria en un archivo zip físico antes de que el archivo zip se cierre de esta manera:

public static void AddFilesToZip(string zipFilename, List filesToAdd)

    using (var memStream = new MemoryStream())
    
        using (Package zip = System.IO.Packaging.Package.Open(memStream, FileMode.Create))
        

            foreach (var fileToAdd in filesToAdd)
            
                string destFilename = ".\" + Path.GetFileName(fileToAdd);
                Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));

                //Existing parts not likely in fresh memory stream
                if (zip.PartExists(uri))
                
                    zip.DeletePart(uri);
                

                PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);

                using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
                

                    using (Stream dest = part.GetStream())
                    
                        CopyStream(fileStream, dest);
                    
                
            

            //The zip Package will add an XML content type file to memeory stream when it closes
            //so before it closes we save the memorystream to physical zip file.
            using (FileStream zipfilestream = new FileStream(zipFilename, FileMode.Create, FileAccess.Write))
            
                memStream.Position = 0;
                CopyStream(memStream, zipfilestream);
            

            // That's it. Zip file saved to file. Things added by package after this point will be to memory stream finally disposed.
        
    

Puedes animar nuestra publicación mostrando un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *