wake-up-neo.net

Wie entpacken Sie alle ZIP-Dateien mit C # 4.0 aus dem Ordner und ohne OpenSource-DLL?

Ich habe einen Ordner mit .Zip-Dateien . Nun möchte ich die Zip-Dateien mithilfe von C # in bestimmte Ordner extrahieren, jedoch ohne externe Assembly oder das .Net Framework 4.5.

Ich habe gesucht, aber keine Lösung gefunden, um * .Zip-Dateien mit Framework 4.0 oder darunter zu entpacken.

Ich habe GZipStream ausprobiert, aber es unterstützt nur GZ- und keine ZIP-Dateien.

18
SHEKHAR SHETE

Hier ist ein Beispiel aus msdn . System.IO.Compression.ZipFile ist nur dafür gemacht:

using System;
using System.IO;
using System.IO.Compression;

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";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

Edit: Entschuldigung, ich habe es versäumt, dass Sie an .NET 4.0 und darunter interessiert sind . Erforderliches .NET-Framework 4.5 und höher.

30
Denys Denysenko

Ich hatte die gleiche Frage und fand einen großartigen und sehr einfachen Artikel, der das Problem löst . http://www.fluxbytes.com/csharp/unzipping-files-using-Shell32-in-c/

sie müssen auf dieCOM-Bibliothek mit dem Namen Microsoft Shell-Steuerelemente und Automatisierung (Interop.Shell32.dll) verweisen.

Der Code (unberührt vom Artikel, damit Sie sehen, wie einfach er ist): 

public static void UnZip(string zipFile, string folderPath)
{
    if (!File.Exists(zipFile))
        throw new FileNotFoundException();

    if (!Directory.Exists(folderPath))
        Directory.CreateDirectory(folderPath);

    Shell32.Shell objShell = new Shell32.Shell();
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile);

    foreach (var file in sourceFile.Items())
    {
        destinationFolder.CopyHere(file, 4 | 16);
    }
}

ich kann es sehr empfehlen, den Artikel zu lesen - er bringt eine Erklärung für die Flaggen 4 | 16

EDIT: Nach einigen Jahren, in denen meine App, die diese verwendet, ausgeführt wurde, erhielt ich Beschwerden von zwei Benutzern, dass die App plötzlich nicht mehr funktioniert .. _. Es scheint, dass die CopyHere-Funktion temporäre Dateien erstellt/Ordner und diese wurden nie gelöscht, was zu Problemen führte ..__ Der Speicherort dieser Dateien befindet sich in System.IO.Path.GetTempPath ().

14
TBD

ZipPackage könnte ein Startplatz sein. Es befindet sich in System.IO.Packaging und ist in .NET 4.0 verfügbar

Nicht in der Nähe der oben genannten Einfachheit der .NET 4.5-Methode, aber es sieht so aus, als könnte es tun, was Sie wollen.

1
Alex

sie können DotNetZip (Open Source) .__ verwenden. `

string zipFilePath = "C:\\sample.Zip";
string extractedFilePath = "C:\\sampleFolder";

ZipFile zipfile = ZipFile.Read(zipFilePath); 
if (!Directory.Exists(extractedFilePath))
    Directory.CreateDirectory(extractedFilePath); 

foreach (ZipEntry e in zipfile)
{
        e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`
0
engntsn

.NET 3.5 hat hierfür einen DeflateStream. Sie müssen Strukturen für die Informationen zu den Verzeichnissen und dergleichen erstellen, aber PKWare hat diese Informationen veröffentlicht. Ich habe ein Unzip-Programm geschrieben, und es ist nicht besonders aufwendig, wenn Sie die Struktur dafür erstellen.

0
Michael Blake

Ich hatte das gleiche Problem und löste es durch Aufrufen der ausführbaren 7-Zip-Datei über die Cmd-Shell vom C # -Code aus wie folgt:

string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;

System.Diagnostics.Process process
         = Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments);

if (!(process.ExitCode == 0))
     throw new Exception("Unable to decompress file: " + zipped_path);

Und wo Launch_in_Shell(...) definiert ist als

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
                                                         string FileName, 
                                                         string Arguments)
{
       System.Diagnostics.ProcessStartInfo processInfo 
                                         = new System.Diagnostics.ProcessStartInfo();

        processInfo.WorkingDirectory = WorkingDirectory;
        processInfo.FileName = FileName;
        processInfo.Arguments = Arguments;
        processInfo.UseShellExecute = true;
        System.Diagnostics.Process process 
                                      = System.Diagnostics.Process.Start(processInfo);

        return process;
}

Nachteile: Sie müssen 7Zip auf Ihrem Computer installiert haben und ich habe es nur mit ".7z" -Dateien versucht. Hoffe das hilft.

0
josuapop