2010-09-20 3 views
16

Ich möchte wissen, ob es einen Weg gibt, [content_types] .xml Datei in der Zip-Datei zu vermeiden, während die Verwendung von .net ZipPackage Klasse.wie man vermeiden [content_types] .xml in .net die ZipPackage Klasse

+0

Was ist der Grund für 'ZipPackage'? Wenn Sie eine ZIP-Datei aus vorhandenen Dokumenten erstellen möchten, verwenden Sie besser 'GZipStream' und verwandte Klassen im' System.IO.Compression'-Namespace. – shahkalpesh

+5

@shahkalpesh: GZipStream ist nur für einzelne Dateien. –

+0

@Henk: Ich möchte eine "ZIP" -Datei für ein einzelnes Dokument erstellen. Ist es möglich, ".zip" -Dateien mit GZipStream zu erstellen? –

Antwort

10

Nr.

Zip-Pakete sind keine (normalen) Zip-Dateien. Sie müssen einer auferlegten Struktur folgen und die Datei Content_Types.xml im Stamm enthalten. ZipPackage = ZipArchive + Structure.

Wenn Sie (und vor allem, wenn Sie wollen) normale Zip-Archive erstellen möchten, benötigen Sie eine zusätzliche Bibliothek, es gibt keine Unterstützung in der BCL.

Siehe SharpZipLib (GPL) und DotNetZip

+0

Was tun Sie gemein mit "normal"? Ist es nicht möglich, eine ".zip" -Datei zu erstellen, indem Sie das verwenden, was sich im .net-Framework befindet? –

+1

@Kushal: Paket = Zip-Archiv + Struktur. So können Sie ein Zip-Paket mit WinZip lesen, aber Sie können nicht (alle) Zip-Dateien mit ZipPackage lesen –

+0

Ich möchte nur eine einzelne Datei zippen. Aber ich bin nicht in der Lage, .xml-Datei loszuwerden, die mit dem Paket eingebettet wird. –

3

Wenn Sie nicht die .Flush() -Methode aufrufen kann, wird es

+0

Dies ist eine ausgezeichnete Antwort auf diese Frage, und diese Technik hat für mich funktioniert. Wenn Sie Ihr 'ZipPackage' mit einem Speicherstream erstellen, fügen Sie Ihre Teile hinzu und kopieren Sie dann den Stream, bevor Sie das' ZipPackage' (das '.Flush()' aufruft) verwenden. Die resultierende Zip-Datei enthält nur Ihre hinzugefügten Teile und keine " [Context_Types] .xml ". –

+0

@DLeh Sorry, was meinst du? Dies ist genau die Methode, um zu vermeiden, dass die Datei zur Zip-Datei hinzugefügt wurde. – Yiping

+0

@MattKlein Danke.Ich habe das zufällig gefunden (ich habe vergessen zu entsorgen). Aber es scheint zu funktionieren. – Yiping

1

Ja, Sie erstellen, ohne die zusätzliche XML-Content-zip Pakete können keine solche Datei sein Datei hinzugefügt

durch diesen Link inspiriert: Using System.IO.Packaging to generate a ZIP file

oben Entdeckung von Yiping erwähnt Verwenden Sie Avoi können d die zusätzliche XML-Datei, die dem Paket hinzugefügt wurde. Speichern Sie Zip-Stream aus dem Speicher-Stream in eine physische Zip-Datei, bevor das Zip-Archiv wie folgt geschlossen wird:

+0

Das funktioniert, danke. Der wichtige Teil ist memStream.Position = 0; ohne diese erhalten Sie einen leeren Reißverschluss. – apc

+1

Wo kommt 'CopyStream'? Ich habe Ihren Code getestet, aber wenn ich den Inhalt der .zip entpacke, sagt, dass die .zip beschädigt ist. –

0

Mann, das hat mir sehr geholfen! Du schaukelst! Ich musste das verwenden, weil mein altes Framework (3.5). Nur zu ergänzen, unter der Umsetzung der CopyStream Funktion siehe:

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); 
    } 
0

Sie können auch festlegen privaten Bereich _contentTypeHelper von System.IO.Packaging.Package zu null (mit DynamicObject).