Ich versuche, eine komprimierte Datei programmgesteuert zu entpacken.
Ich habe versucht, die System.IO.Compression.GZipStream
Klasse in .NET zu verwenden, aber wenn meine App ausgeführt wird (eigentlich ein Komponententest), wird folgende Ausnahme angezeigt:
System.IO.InvalidDataException: Die magische Zahl im GZip-Header ist nicht korrekt. Stellen Sie sicher, dass Sie einen GZip-Stream übergeben.
Mir ist jetzt klar, dass eine .zip
Datei nicht mit einer .gz
Datei identisch ist , und das GZip
ist auch nicht mit Zip
.
Da ich die Datei jedoch extrahieren kann, indem ich manuell auf die komprimierte Datei doppelklicke und dann auf die Schaltfläche "Alle Dateien extrahieren" klicke, sollte es meiner Meinung nach auch im Code eine Möglichkeit geben, dies zu tun.
Daher habe ich versucht, Process.Start()
den Pfad zur komprimierten Datei als Eingabe zu verwenden. Dadurch öffnet meine App ein Fenster, in dem der Inhalt der komprimierten Datei angezeigt wird. Das ist alles in Ordnung, aber die App wird auf einem Server installiert, auf dem sich keiner befindet, um auf die Schaltfläche "Alle Dateien extrahieren" zu klicken.
Wie kann ich meine App dazu bringen, die Dateien in den komprimierten Dateien zu extrahieren?
Oder gibt es einen anderen Weg, es zu tun? Ich bevorzuge es im Code, ohne Bibliotheken oder Apps von Drittanbietern herunterzuladen. Die Sicherheitsabteilung ist nicht besonders begeistert davon ...
Antworten:
Wir haben SharpZipLib bei vielen Projekten erfolgreich eingesetzt. Ich weiß, dass es sich um ein Tool von Drittanbietern handelt, aber der Quellcode ist enthalten und könnte einen Einblick geben, wenn Sie das Rad hier neu erfinden.
quelle
Mit .NET 4.5 können Sie jetzt Dateien mit dem .NET Framework entpacken:
Der obige Code stammt direkt aus der Microsoft-Dokumentation: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
ist in der Baugruppe enthaltenSystem.IO.Compression.FileSystem
. (Danke Nateirvin ... siehe Kommentar unten)quelle
ZipFile
ist in der Baugruppe enthaltenSystem.IO.Compression.FileSystem
.System.IO.Compression.FileSystem.dll
.A local file header is corrupt
. Irgendwas darüber?Für .Net 4.5+
Es ist nicht immer erwünscht, die unkomprimierte Datei auf die Festplatte zu schreiben. Als ASP.Net-Entwickler müsste ich mit den Berechtigungen herumspielen, um Rechte für meine Anwendung zum Schreiben in das Dateisystem zu gewähren. Durch die Arbeit mit Streams im Speicher kann ich all das umgehen und die Dateien direkt lesen:
Alternativ können Sie die dekomprimierte Datei weiterhin auf die Festplatte schreiben, indem Sie Folgendes aufrufen
ExtractToFile()
:Um die
ZipArchive
Klasse zu verwenden, müssen Sie einen Verweis auf denSystem.IO.Compression
Namespace und auf hinzufügenSystem.IO.Compression.FileSystem
.quelle
ZipArchive
Objekt passt gut zur Rechnung.foreach
Schleife verwenden,ExtractToFile
wenn ich nur verwenden kannZipFile.ExtractToDirectory(inputFile, outputDir);
? Was ist der Vorteil der ersten Methode?Kostenlose und keine externen DLL-Dateien. Alles ist in einer CS-Datei. Ein Download ist nur die CS-Datei, ein anderer Download ist ein sehr leicht verständliches Beispiel. Ich habe es heute versucht und kann nicht glauben, wie einfach das Setup war. Es funktionierte beim ersten Versuch, keine Fehler, kein Nichts.
https://github.com/jaime-olivares/zipstorer
quelle
Verwenden Sie die DotNetZip-Bibliothek unter http://www.codeplex.com/DotNetZip
quelle
Um die ZipFile-Klasse verwenden zu können, müssen Sie in Ihrem Projekt einen Verweis auf die Assembly System.IO.Compression.FileSystem hinzufügen
quelle
Standard-Zip-Dateien verwenden normalerweise den Deflate-Algorithmus.
Verwenden Sie DeflateStream, um Dateien zu extrahieren, ohne Bibliotheken von Drittanbietern zu verwenden. Sie benötigen etwas mehr Informationen zum Archivierungsformat für ZIP-Dateien, da Microsoft nur den Komprimierungsalgorithmus bereitstellt.
Sie können auch versuchen, zipfldr.dll zu verwenden. Es ist die Komprimierungsbibliothek von Microsoft (komprimierte Ordner aus dem Menü Senden an). Es scheint eine Com-Bibliothek zu sein, ist aber nicht dokumentiert. Möglicherweise können Sie es durch Experimente zum Laufen bringen.
quelle
Ich benutze dies, um mehrere Dateien zu komprimieren oder zu entpacken. Das Regex-Zeug ist nicht erforderlich, aber ich verwende es, um den Datumsstempel zu ändern und unerwünschte Unterstriche zu entfernen. Ich verwende die leere Zeichenfolge in der Zeichenfolge "Komprimieren >> zipPath", um allen Dateien bei Bedarf etwas voranzustellen. Außerdem kommentiere ich normalerweise entweder Compress () oder Decompress () aus, je nachdem, was ich tue.
quelle
Das wird es tun
System.IO.Compression.ZipFile.ExtractToDirectory(ZipName, ExtractToPath)
quelle
Von hier aus :
quelle
Sie können alles in .NET 3.5 mit DeflateStream ausführen. In .NET 3.5 fehlt die Möglichkeit, die Dateikopfabschnitte zu verarbeiten, die zum Organisieren der komprimierten Dateien verwendet werden. PKWare hat diese Informationen veröffentlicht, mit denen Sie die Zip-Datei verarbeiten können, nachdem Sie die verwendeten Strukturen erstellt haben. Es ist nicht besonders belastend und eine gute Vorgehensweise beim Erstellen von Werkzeugen ohne Verwendung von Code von Drittanbietern.
Es ist keine einzeilige Antwort, aber es ist völlig machbar, wenn Sie bereit und in der Lage sind, sich die Zeit zu nehmen. Ich habe eine Klasse geschrieben, um dies in ein paar Stunden zu tun, und was ich daraus gemacht habe, ist die Möglichkeit, Dateien nur mit .NET 3.5 zu komprimieren und zu entpacken.
quelle
Ich habe heute von diesem (Unzip-Paket auf NuGet) erfahren, da ich in DotNetZip auf einen schweren Fehler gestoßen bin und festgestellt habe, dass in den letzten zwei Jahren nicht wirklich so viel an DotNetZip gearbeitet wurde.
Das Unzip-Paket ist schlank und hat die Arbeit für mich erledigt - es hatte nicht den Fehler, den DotNetZip hatte. Außerdem war es eine relativ kleine Datei, die sich bei der eigentlichen Dekomprimierung auf die Microsoft BCL stützte. Ich konnte leicht Anpassungen vornehmen, die ich brauchte (um den Fortschritt beim Dekomprimieren verfolgen zu können). Ich empfehle es.
quelle
Aus eingebetteten Ressourcen:
quelle
Bisher habe ich cmd-Prozesse verwendet, um eine ISO-Datei zu extrahieren, sie in einen temporären Pfad vom Server zu kopieren und auf einem USB-Stick zu extrahieren. Kürzlich habe ich festgestellt, dass dies perfekt mit ISO-Geräten funktioniert, die weniger als 10 GB groß sind. Für eine ISO wie 29 GB bleibt diese Methode irgendwie hängen.
quelle
Sie können die Info-unzip- Befehlszeile cod verwenden. Sie müssen nur unzip.exe von der offiziellen Info-unzip-Website herunterladen.
quelle