deseo saber si hay alguna manera de evitar tener un [Content_Types] .xml archivo dentro del archivo zip durante el uso de .NET ZipPackage clase.cómo evitar [Content_Types] .xml en la clase de .NET ZipPackage
Respuesta
Nº
Paquetes postales no son archivos (normal) Zip. Deben seguir una estructura impuesta y contener ese archivo Content_Types.xml
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 el BCL.
Ver SharpZipLib (GPL) y DotNetZip
¿Qué haces? significa por "normal"? ¿No es posible crear un archivo ".zip" usando lo que está dentro de .NET Framework? –
@Kushal: Paquete = Archivo Zip + Estructura. Para que pueda leer un paquete Zip con WinZip, pero no puede leer (todos) los archivos Zip con ZipPackage –
Solo deseo comprimir un solo archivo. Pero no puedo deshacerme del archivo .xml que se integra con el paquete. –
Si no llama al método .Flush(), no habrá tal archivo
Esta es una excelente respuesta a esta pregunta, y esta técnica funcionó para mí. Si crea su 'ZipPackage' con una secuencia de memoria, agregue sus partes, y luego copie la secuencia antes de eliminar el' ZipPackage' (que llama '.Flush()'), entonces el archivo zip resultante contiene solo las partes agregadas y no " [Context_Types] .xml ". –
@DLeh Disculpa, ¿a qué te refieres? Este es exactamente el método para evitar que el archivo se haya agregado al archivo comprimido. – Yiping
@MattKlein Gracias.Encontré esto por accidente (olvidé deshacerme). Pero parece estar funcionando. – Yiping
Sí se puede crear paquetes postales sin el contenido XML adicional archivo añadió
Inspirado por este enlace: Using System.IO.Packaging to generate a ZIP file
Usando anterior descubrimiento mencionado por Yiping puede avoi d el archivo extra xml agregado al paquete. Guardar corriente postal de la corriente de memoria a un archivo zip físico antes de archivo zip se cierra de esta manera:
public static void AddFilesToZip(string zipFilename, List<String> 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);
}
//Thats it. Zip file saved to file. Things added by package after this point will be to meory stream finally disposed.
}
}
}
Tengo esto funcionando, gracias. La parte importante es memStream.Position = 0; sin esto obtendrás un zip vacío. – apc
¿De dónde viene 'CopyStream'? Probé tu código, pero cuando extraigo el contenido de .zip, dice que el .zip está dañado. –
Hombre, esto me ha ayudado mucho! ¡Rock! Tuve que usar esto porque mi viejo marco (3.5). Sólo para complementar, véase más adelante la implementación de la función CopyStream:
private void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
target.Write(buf, 0, bytesRead);
}
También puede establecer ámbito privado _contentTypeHelper
de System.IO.Packaging.Package
a null
(usando DynamicObject
).
- 1. Cómo evitar la inyección XML
- 2. Cómo prevenir la inyección de XPath/XML en .NET
- 3. Cómo leer XML en .NET?
- 4. Cómo evitar que la clase PrettyPrinter XML de Scala elimine las líneas nuevas
- 5. ¿Cómo puedo evitar una InvalidCastException en .NET?
- 6. .Net - estrategias para evitar la cadena mágica
- 7. Cómo serializar este XML en .NET (matriz)
- 8. Clase de resumen, ¿cómo evitar la duplicación de código?
- 9. Evitar advertencias XML DOMDocument en php
- 10. La clase XmlDocument está eliminando el formato, C#, .NET
- 11. Posible extender la clase String en .net
- 12. .Net Comentario XML en la documentación de la API
- 13. ¿Cómo controlo la parte <?xml ?> de la serialización xml con .NET?
- 14. .Net Serialización XML basada en un XSD?
- 15. clase montón en .NET
- 16. expresión regular para analizar XML en .NET
- 17. Cómo evitar el parpadeo en TableLayoutPanel en C# .net
- 18. ¿Cómo evitar la copia de archivos de documentación XML en una compilación en modo de lanzamiento?
- 19. Cómo incrustar xml en xml
- 20. serializar clase a XML?
- 21. ¿Cómo evitar la recolección de basura en la aplicación .NET en tiempo real?
- 22. .NET xml docs - herencia de documentación
- 23. ¿Cómo pongo ejemplos de código en comentarios XML de .NET?
- 24. Cambio de XML usando .Net
- 25. .NET XML Pretty Printer?
- 26. Parse cadena XML a la clase en C#?
- 27. .NET Implementación de XML eficiente
- 28. deserialización XML 'estandarización' de finales de línea, cómo detenerla? (.NET)
- 29. NET serialización XML y la herencia
- 30. Evitar la descarga de DTD al analizar XML
¿Cuál es su razón para usar 'ZipPackage'? Si desea crear un archivo zip a partir de documentos existentes, es mejor que use 'GZipStream' y clases relacionadas en el espacio de nombres' System.IO.Compression'. – shahkalpesh
@shahkalpesh: GZipStream es solo para archivos individuales. –
@Henk: Deseo crear un archivo ".zip" para un solo documento. ¿Es posible crear un archivo ".zip" usando GZipStream? –