| 

.NET C# Java Javascript Exception

3
Ich möchte eine Datei komprimieren, ohne auf Fremdkomponenten zurückgreifen zu müssen. .NET bietet den ZIP-Algorithmus angeblich bereits an. Wie nutze ich den und wie kombiniere ich ggfs. In einzelnen Archiven mehrere Dateien?
03.02.2011
Neko 31 1 2
2 Antworten
3
Seit .Net 3.0 gibt es eine ZipPackage-Klasse.


Hier der Beispiel aus der MSDN: http://msdn.microsoft.com/de-de/library/system.io.packaging.zippackage.aspx#Y393

//  -------------------------- CreatePackage --------------------------
/// <summary>
/// Creates a package zip file containing specified
/// content and resource files.</summary>
private static void CreatePackage()
{
// Convert system path and file names to Part URIs. In this example
// Uri partUriDocument /* /Content/Document.xml */ =
// PackUriHelper.CreatePartUri(
// new Uri("Content\Document.xml", UriKind.Relative));
// Uri partUriResource /* /Resources/Image1.jpg */ =
// PackUriHelper.CreatePartUri(
// new Uri("Resources\Image1.jpg", UriKind.Relative));
Uri partUriDocument = PackUriHelper.CreatePartUri(
new Uri(documentPath, UriKind.Relative));
Uri partUriResource = PackUriHelper.CreatePartUri(
new Uri(resourcePath, UriKind.Relative));

// Create the Package
// (If the package file already exists, FileMode.Create will
// automatically delete it first before creating a new one.
// The 'using' statement insures that 'package' is
// closed and disposed when it goes out of scope.)
using (Package package =
Package.Open(packagePath, FileMode.Create))
{
// Add the Document part to the Package
PackagePart packagePartDocument =
package.CreatePart(partUriDocument,
System.Net.Mime.MediaTypeNames.Text.Xml);

// Copy the data to the Document Part
using (FileStream fileStream = new FileStream(
documentPath, FileMode.Open, FileAccess.Read))
{
CopyStream(fileStream, packagePartDocument.GetStream());
}// end:using(fileStream) - Close and dispose fileStream.

// Add a Package Relationship to the Document Part
package.CreateRelationship(packagePartDocument.Uri,
TargetMode.Internal,
PackageRelationshipType);

// Add a Resource Part to the Package
PackagePart packagePartResource =
package.CreatePart(partUriResource,
System.Net.Mime.MediaTypeNames.Image.Jpeg);

// Copy the data to the Resource Part
using (FileStream fileStream = new FileStream(
resourcePath, FileMode.Open, FileAccess.Read))
{
CopyStream(fileStream, packagePartResource.GetStream());
}// end:using(fileStream) - Close and dispose fileStream.

// Add Relationship from the Document part to the Resource part
packagePartDocument.CreateRelationship(
new Uri(@"../resources/image1.jpg",
UriKind.Relative),
TargetMode.Internal,
ResourceRelationshipType);

}// end:using (Package package) - Close and dispose package.

}// end:CreatePackage()


// --------------------------- CopyStream ---------------------------
/// <summary>
/// Copies data from a source stream to a target stream.</summary>
/// <param name="source">
/// The source stream to copy from.</param>
/// <param name="target">
/// The destination stream to copy to.</param>
private static 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);
}// end:CopyStream()
03.02.2011
Floyd 14,6k 3 9
0
Die in .NET enthaltenen ZIP-Möglichkeiten sind - meiner Erfahrung nach - relativ lahm.

Wesentlich besser und schneller schien mir immer die ZIP-Bibliothek von SharpDevelop zu sein: SharpZipLib
03.02.2011
Golo Roden 2,7k 3 9
Die Anforderung war aber: "ohne auf Fremdkomponenten zurückgreifen zu müssen" ;)
Floyd 03.02.2011
Btw, eine kleine Anmerkung zur SharpZibLib. WTF is das teil langsam. Die Libary wird zusammen mit PdfSharp ausgeliefert und wird dort für die Kompression von Bildern verwendet. Bei vielen großen Bildern sind die Laufzeiten nicht mehr akzeptabel (mehrere Minuten für insgesammt 6 MB Bilddaten) woraufhin wir den Code umgeschrieben und auf zLib umgestellt hatten.
Floyd 03.02.2011
Okay, das mit der Fremdkomponente hatte ich überlesen ... ups ^^
Golo Roden 03.02.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH