ZIP Datei entpacken

Tikonteroga

Erfahrenes Mitglied
Hallo,

ich muss in einer C# Anwendung die Dateien aus einer *.ZIP Datei auslesen und ver- bzw. bearbeiten. Anschließend muss ich die Dateien wieder in der *.ZIP Datei speichern.

Ich habe jetzt schon rumgesucht, aber keine Möglichkeit gefunden dies zu Realisieren.

Die Anforderung ist, dass es mit einer möglichst niedrigen Version des .NET Frameworks funktionieren muss und keine 3rd Libraries verwendet werden dürfen. Es muss auch sowohl unter Windows XP und Windows 7 unterstützt werden.
 
Hallo,

also ich habe es mal mit der Klasse ZipPackage versucht. Leider habe ich es noch nicht zum Funktionieren gebracht.

Ich habe versucht mir mal den Inhalt einer *.zip Datei anzeigen zu lassen.

Code:
Package package = ZipPackage.Open(fileName, FileMode.Open, FileAccess.Read);

PackagePartCollection parts = package.GetParts();

foreach (PackagePart part in parts)
{
     Uri uri = part.Uri;

     System.Console.WriteLine(uri);
}

Dabei liefert package.GetParts() jedoch eine leere PackagePartCollection zurück obwohl es sich bei fileName um eine *.zip Datei mit mehreren Dateien und Verzeichnissen handelt.

Gruß

Tikonteroga
 
Hi.

Das ZipPackage von Microsoft funktioniert nur wenn das .zip eine bestimmte XML Datei enthält (kann mich grad nicht erinnern wie die heißen muß).

D.h. es ist in der Regel unbrauchbar um beliebige Zip Dateien zu verarbeiten.

Verwende doch einfach die DotNetZipLib => http://dotnetzip.codeplex.com/

Einfacher geht es nicht.

Gruß
 
@Deepthroat
Die Anforderung war: Keine 3rd Party Libs ;)
Oh, das hab ich nicht gelesen. Ist aber in der Regel auch Schwachsinn solch eine Selbstgeißelung... ;)

(Wenn das mit .NET vernünftig funktionieren würde, hätten wohl weniger Leute externe Zip Bibliotheken geschrieben...)
Die älteste und einfachste (wobei das hier auf die Funktionalität bezogen ist) sind die Klassen aus System.IO.Compression. Vorhanden seit .NET 2.0
Das sind aber nur die Grundbausteine um mit Zip Dateien umgehen zu können. Da müßte man erstmal das Zip Format Implementieren -- um Prinzip genau so wie es DotNetZip macht...

Eine andere Möglichkeit ist die Verwendung von P/Invoke und den WinAPI zip Funktionen => http://www.codeproject.com/KB/cs/compresswithwinshellapics.aspx + http://www.codeproject.com/KB/cs/decompresswinshellapics.aspx

Das bietet aber auch nur relativ limitierte Funktionalität...

Gruß
 
Oh, das hab ich nicht gelesen. Ist aber in der Regel auch Schwachsinn solch eine Selbstgeißelung... ;)
Vielleicht ja auch eine Aufgabe im Studium?! Anforderung ist nun mal Anforderung!
(Wenn das mit .NET vernünftig funktionieren würde, hätten wohl weniger Leute externe Zip Bibliotheken geschrieben...)

Das sind aber nur die Grundbausteine um mit Zip Dateien umgehen zu können. Da müßte man erstmal das Zip Format Implementieren -- um Prinzip genau so wie es DotNetZip macht...
Wieso das Zip-Format implementieren? :confused:
DeflateStream bietet eine einfache Möglichkeit Zip-Archive zu erzeugen. Weder in der MSDN noch in meinen Posts steht, dass es alles kann. ;)
Egal was, es muss auch nicht ALLES können, sondern den Anforderungen genügen :)
Eine andere Möglichkeit ist die Verwendung von P/Invoke und den WinAPI zip Funktionen => http://www.codeproject.com/KB/cs/compresswithwinshellapics.aspx + http://www.codeproject.com/KB/cs/decompresswinshellapics.aspx

Das bietet aber auch nur relativ limitierte Funktionalität...

Gruß
Schau doch bitte nochmal in den Anforderungen :)
 
Hi

Wieso das Zip-Format implementieren? :confused:
Das, was aus der Klasse im Compression-Namespace rauskommt ist zwar komprimiert, passt aber nicht ganz mit einer Zip-Datei zusammen (Header und/oder irgendwas).

@PInvoke&Winapi:
Schau doch bitte nochmal in den Anforderungen :)
XP und 7: Erfüllt
Möglichst Abwärtskompatibel: Sollte ausreichend erfüllt sein, XP geht sicher
Keine externen Libs: Erfüllt

Wo ist das Problem?
 
Das, was aus der Klasse im Compression-Namespace rauskommt ist zwar komprimiert, passt aber nicht ganz mit einer Zip-Datei zusammen (Header und/oder irgendwas).
Richtig. Die Klassen im Compression-Namespace stellen einfach einige Kompressionsmethoden zur Verfügung, die man dann fürs Zippen verwenden könnte. Eine Zip Datei besteht aber i.d.R. aus mehreren komprimierten Datenströmen und enthält verschiedene Metainformation über die Einträge (Kompressionsmethode (es gibt verschiedene), zumindest DOS Date/Time, wo fangen die Daten im Zip für den Eintrag an usw.).

Gruß
 
Hallo,

danke für die Beiträge. Ich werde das Problem am Montag weiterbearbeiten. Jetzt habe ich erst einmal Feierabend und Wochenenden.

Da es oft das Thema innerhalb der Diskussion war, werde ich kurz auf das Thema mit den Third Libraries eingehen.

Die Software die ich entwickle wird kommerziell verwendet und wird letztendlich sehr komplex werden. Wenn ich jetzt eine Third Party Library einsetze muss ich diese Library zum Einen testen und zum Anderen muss ich sie mit einer Anwendung ausliefern und erhöhe somit den Aufwand für das Konfigurationsmanagement.

Bei der .NET Library kann ich davon ausgehen, dass Sie funktioniert und diese ist auch auf den Rechner meiner Zielgruppe zumindest in einer bestimmten Version bereits installiert.
 
Zurück