Entpacken Sie die Dateien programmgesteuert in .net

Ich versuche, eine gezippte Datei programmatisch zu entpacken.

Ich habe versucht, die System.IO.Compression.GZipStream class in .NET zu verwenden, aber wenn meine Anwendung System.IO.Compression.GZipStream (eigentlich ein System.IO.Compression.GZipStream ), erhalte ich diese Ausnahme:

System.IO.InvalidDataException: Die magische Zahl im GZip-Header ist nicht korrekt. Stelle sicher, dass du in einem GZip-Stream vorbeifährst ..

Ich GZip jetzt fest, dass eine .zip Datei nicht mit einer .gz Datei GZip ist und dass GZip nicht mit Zip GZip ist.

Da ich die Datei jedoch extrahieren kann, indem ich manuell auf die gezippte Datei doppelklicke und dann auf den “Alle Dateien extrahieren” -Knopf klicke, denke ich, dass es auch im Code eine Möglichkeit geben sollte, dies zu tun.

Deshalb habe ich versucht, Process.Start() mit dem Pfad zur gezippten Datei als Eingabe zu verwenden. Dadurch öffnet meine App ein Fenster, in dem der Inhalt der gezippten Datei angezeigt wird. Das ist alles in Ordnung, aber die App wird auf einem Server ohne Umgebung installiert, um auf die Schaltfläche “Alle Dateien extrahieren” zu klicken.

Also, wie bekomme ich meine App, um die Dateien in den gezippten Dateien zu extrahieren?

Oder gibt es einen anderen Weg, es zu tun? Ich bevorzuge es in Code zu tun, ohne Bibliotheken oder Apps von Drittanbietern herunterzuladen; Die Sicherheitsabteilung ist nicht allzu schick …

   

    Wir haben SharpZipLib in vielen Projekten erfolgreich eingesetzt. Ich weiß, es ist ein Tool von Drittanbietern, aber Quellcode ist enthalten und könnte einen Einblick geben, wenn Sie das Rad hier neu erfinden möchten.

    Mit .NET 4.5 können Sie nun Dateien mit dem .NET Framework entpacken:

     using System; using System.IO; namespace ConsoleApplication { class Program { static void Main(string[] args) { string startPath = @"c:\example\start"; string zipPath = @"c:\example\result.zip"; string extractPath = @"c:\example\extract"; System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath); System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath); } } } 

    Der obige Code wurde direkt aus der Dokumentation von Microsoft entnommen: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

    ZipFile ist in der Assembly System.IO.Compression.FileSystem . (Danke nateirvin … siehe Kommentar unten)

    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 mich mit Rechten herumärgern, um meiner Anwendung das Recht zu geben, in das Dateisystem zu schreiben. Indem ich mit Streams im Speicher arbeite, kann ich das alles umgehen und die Dateien direkt lesen:

     using (ZipArchive archive = new ZipArchive(postedZipStream)) { foreach (ZipArchiveEntry entry in archive.Entries) { var stream = entry.Open(); //Do awesome stream stuff!! } } 

    Alternativ können Sie die dekomprimierte Datei weiterhin auf den Datenträger schreiben, indem Sie ExtractToFile() aufrufen:

     using (ZipArchive archive = ZipFile.OpenRead(pathToZip)) { foreach (ZipArchiveEntry entry in archive.Entries) { entry.ExtractToFile(Path.Combine(destination, entry.FullName)); } } 

    Um die ZipArchive class zu verwenden, müssen Sie einen Verweis auf den System.IO.Compression Namespace System.IO.Compression .

    Frei und keine externen DLL-Dateien. Alles ist in einer CS-Datei. Ein Download ist nur die CS-Datei, ein weiterer Download ist ein sehr einfach zu verstehendes Beispiel. Habe es heute einfach ausprobiert und ich kann nicht glauben, wie einfach das Setup war. Es hat beim ersten Versuch funktioniert, keine Fehler, nichts.

    https://github.com/jaime-olivares/zipstorer

    Verwenden Sie die DotNetZip-Bibliothek unter http://www.codeplex.com/DotNetZip

    classnbibliothek und Toolset zum Manipulieren von Zip-Dateien. Verwenden Sie VB, C # oder eine beliebige .NET-Sprache zum einfachen Erstellen, Extrahieren oder Aktualisieren von Zip-Dateien …

    DotNetZip funktioniert auf PCs mit dem vollständigen .NET Framework und läuft auch auf mobilen Geräten, die .NET Compact Framework verwenden. Erstellen und lesen Sie zip-Dateien in VB, C # oder einer beliebigen .NET-Sprache oder einer beliebigen Skriptumgebung …

    Wenn alles, was Sie wollen, eine bessere DeflateStream oder GZipStream-class ist, um die zu ersetzen, die in .NET BCL integriert ist, hat DotNetZip das auch. DotNetZips DeflateStream und GZipStream sind in einer eigenständigen Assembly verfügbar, die auf einem .NET-Port von Zlib basiert. Diese Streams unterstützen Komprimierungsstufen und bieten eine viel bessere performance als die integrierten classn. Es gibt auch einen ZlibStream zur Vervollständigung des Sets (RFC 1950, 1951, 1952) …

     String ZipPath = @"c:\my\data.zip"; String extractPath = @"d:\\myunzips"; ZipFile.ExtractToDirectory(ZipPath, extractPath); 

    Um die ZipFile-class zu verwenden, müssen Sie der Assembly System.IO.Compression.FileSystem in Ihrem Projekt einen Verweis hinzufügen

    Standard-Zip-Dateien verwenden normalerweise den Deflate-Algorithmus.

    Verwenden Sie DeflateStream, um Dateien ohne Verwendung von Drittanbieterbibliotheken zu extrahieren. Sie benötigen ein wenig mehr Informationen über das Zip-Dateiarchivformat, da Microsoft nur den Komprimierungsalgorithmus bereitstellt.

    Sie können auch versuchen, zipfldr.dll zu verwenden. Es ist Microsofts Komprimierungsbibliothek (komprimierte Ordner im Menü Senden an). Es scheint eine com-Bibliothek zu sein, aber es ist nicht dokumentiert. Möglicherweise können Sie es durch Experimentieren für Sie arbeiten lassen.

    Von hier aus :

    Komprimierte GZipStream-Objekte, die in eine Datei mit der Erweiterung .gz geschrieben wurden, können mit vielen gängigen Komprimierungstools dekomprimiert werden. Diese class bietet jedoch keine functionalität zum Hinzufügen oder Extrahieren von Dateien aus ZIP-Archiven.

    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 Compress >> zipPath-Zeichenfolge, um bei Bedarf allen Dateien ein Präfix zuzuordnen. Außerdem gebe ich normalerweise Compress () oder Decompress () aus, je nachdem, was ich gerade mache.

     using System; using System.IO.Compression; using System.IO; using System.Text.RegularExpressions; namespace ZipAndUnzip { class Program { static void Main(string[] args) { var directoryPath = new DirectoryInfo(@"C:\your_path\"); Compress(directoryPath); Decompress(directoryPath); } public static void Compress(DirectoryInfo directoryPath) { foreach (DirectoryInfo directory in directoryPath.GetDirectories()) { var path = directoryPath.FullName; var newArchiveName = Regex.Replace(directory.Name, "[0-9]{8}", "20130913"); newArchiveName = Regex.Replace(newArchiveName, "[_]+", "_"); string startPath = path + directory.Name; string zipPath = path + "" + newArchiveName + ".zip"; ZipFile.CreateFromDirectory(startPath, zipPath); } } public static void Decompress(DirectoryInfo directoryPath) { foreach (FileInfo file in directoryPath.GetFiles()) { var path = directoryPath.FullName; string zipPath = path + file.Name; string extractPath = Regex.Replace(path + file.Name, ".zip", ""); ZipFile.ExtractToDirectory(zipPath, extractPath); } } } } 

    Sie können alles in .NET 3.5 mit DeflateStream tun. Was in .NET 3.5 fehlt, ist die Möglichkeit, die Datei-Header-Abschnitte zu verarbeiten, die zum Organisieren der gezippten Dateien verwendet werden. PKWare hat diese Informationen veröffentlicht, mit denen Sie die ZIP-Datei nach dem Erstellen der verwendeten Strukturen bearbeiten können. Es ist nicht besonders aufwendig, und es ist eine gute Übung im Werkzeugbau, ohne den Code von Drittanbietern zu verwenden.

    Es ist keine Ein-Zeilen-Antwort, aber es ist völlig machbar, wenn Sie bereit und in der Lage sind, sich die Zeit selbst zu nehmen. Ich schrieb eine class, um dies in ein paar Stunden zu tun, und was ich davon bekam, ist die Fähigkeit, Dateien zu komprimieren und zu entpacken, nur mit .NET 3.5.

    Ich habe heute von diesem (Unzip-Paket auf NuGet) erfahren, da ich in DotNetZip auf einen harten Bug stieß, und mir wurde klar, dass es in den letzten zwei Jahren nicht wirklich viel Arbeit auf DotNetZip gegeben hat.

    Das Unzip-Paket ist schlank, und es hat die Aufgabe für mich erledigt – es hatte nicht den Fehler, den DotNetZip hatte. Außerdem war es eine relativ kleine Datei, die sich auf die Microsoft BCL für die eigentliche Dekomprimierung verließ. Ich konnte leicht Anpassungen vornehmen, die ich benötigte (um den Fortschritt während des Dekomprimierens verfolgen zu können). Ich empfehle es.

    Aus Einbetten von Ressourcen:

     using (Stream _pluginZipResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(programName + "." + "filename.zip")) { using (ZipArchive zip = new ZipArchive(_pluginZipResourceStream)) { zip.ExtractToDirectory(Application.StartupPath); } } 

    Bisher habe ich CMD-processe 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 funktioniert, die weniger als 10 GB sind. Für ein iso wie 29Gb bleibt diese Methode irgendwie stecken.

      public void ExtractArchive() { try { try { Directory.Delete(copyISOLocation.OutputPath, true); } catch (Exception e) when (e is IOException || e is UnauthorizedAccessException) { } Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal; //stackoverflow cmd.StartInfo.Arguments = "-R"; cmd.Disposed += (sender, args) => { Console.WriteLine("CMD Process disposed"); }; cmd.Exited += (sender, args) => { Console.WriteLine("CMD Process exited"); }; cmd.ErrorDataReceived += (sender, args) => { Console.WriteLine("CMD Process error data received"); Console.WriteLine(args.Data); }; cmd.OutputDataReceived += (sender, args) => { Console.WriteLine("CMD Process Output data received"); Console.WriteLine(args.Data); }; //stackoverflow cmd.Start(); cmd.StandardInput.WriteLine("C:"); //Console.WriteLine(cmd.StandardOutput.Read()); cmd.StandardInput.Flush(); cmd.StandardInput.WriteLine("cd C:\\\"Program Files (x86)\"\\7-Zip\\"); //Console.WriteLine(cmd.StandardOutput.ReadToEnd()); cmd.StandardInput.Flush(); cmd.StandardInput.WriteLine(string.Format("7z.exe x -o{0} {1}", copyISOLocation.OutputPath, copyISOLocation.TempIsoPath)); //Console.WriteLine(cmd.StandardOutput.ReadToEnd()); cmd.StandardInput.Flush(); cmd.StandardInput.Close(); cmd.WaitForExit(); Console.WriteLine(cmd.StandardOutput.ReadToEnd()); Console.WriteLine(cmd.StandardError.ReadToEnd()); 

    Sie können die Befehlszeile Info-unzip verwenden. Sie müssen nur unzip.exe von der offiziellen Website von Info-unzip herunterladen.

      internal static void Unzip(string sorcefile) { try { AFolderFiles.AFolderFilesDelete.DeleteFolder(TempBackupFolder); // delete old folder AFolderFiles.AFolderFilesCreate.CreateIfNotExist(TempBackupFolder); // delete old folder //need to Command command also to export attributes to a excel file System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; // window type startInfo.FileName = UnzipExe; startInfo.Arguments = sorcefile + " -d " + TempBackupFolder; process.StartInfo = startInfo; process.Start(); //string result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); process.Dispose(); process.Close(); } catch (Exception ex){ throw ex; } }