c# - Komprimieren / Dekomprimieren von Ordnern und Dateien

Translate

Kennt jemand eine gute Möglichkeit, Dateien und Ordner in C # schnell zu komprimieren oder zu dekomprimieren? Der Umgang mit großen Dateien kann erforderlich sein.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Der .Net 2.0-Framework-NamespaceSystem.IO.Compressionunterstützt GZip- und Deflate-Algorithmen. Hier sind zwei Methoden zum Komprimieren und Dekomprimieren eines Byte-Streams, den Sie von Ihrem Dateiobjekt erhalten können. Sie können ersetzenGZipStreamzumDefaultStreamin den folgenden Methoden, um diesen Algorithmus zu verwenden. Dies lässt jedoch das Problem des Umgangs mit Dateien, die mit verschiedenen Algorithmen komprimiert wurden, bestehen.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}
Quelle
Translate

Ich habe immer die SharpZip-Bibliothek verwendet.

Hier ist ein Link

Quelle
Translate

Ab .Net 1.1 ist die einzige verfügbare Methode, in die Java-Bibliotheken zu greifen.
Verwenden der Zip-Klassen in den J # -Klassenbibliotheken zum Komprimieren von Dateien und Daten mit C #
Ich bin mir nicht sicher, ob sich dies in den letzten Versionen geändert hat.

Quelle
Fitch Lee
Translate

Sie können eine verwendenDrittanbieter-Bibliothek wie SharpZipwie Tom betonte.

Eine andere Möglichkeit (ohne Drittanbieter) besteht darin, die Windows Shell-API zu verwenden. Sie müssen in Ihrem C # -Projekt einen Verweis auf die Microsoft Shell Controls and Automation COM-Bibliothek festlegen. Gerald Gibson hat ein Beispiel bei:

Kopie der toten Seite des Internetarchivs

Quelle
Translate

Meine Antwort wäre, die Augen zu schließen und sich für zu entscheidenDotNetZip. Es wurde von einer großen Community getestet.

Quelle
Translate

GZipStreamist ein wirklich gutes Dienstprogramm.

Quelle
Translate

Dies ist in Java sehr einfach, und wie oben angegeben, können Sie von C # aus in die Bibliotheken java.util.zip zugreifen. Referenzen siehe:

java.util.zip javadocs
Beispielcode

Ich habe dies vor einiger Zeit verwendet, um eine tiefe (rekursive) Zip-Datei einer Ordnerstruktur zu erstellen, aber ich glaube nicht, dass ich jemals das Entpacken verwendet habe. Wenn ich so motiviert bin, kann ich diesen Code herausziehen und später hier bearbeiten.

Quelle
Rok
Translate

Eine andere gute Alternative ist auchDotNetZip.

Quelle
Translate

Mit dieser Methode können Sie eine Zip-Datei erstellen:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
    {
        var path = HostingEnvironment.MapPath(TempPath) + name;
        await Task.Run(() =>
        {
            if (File.Exists(path)) File.Delete(path);
            ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
        });
        return path;
    }

und dann können Sie die Zip-Datei mit folgenden Methoden entpacken:
1- Diese Methode funktioniert mit dem Zip-Dateipfad

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
    {
        await Task.Run(() =>
        {
            var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
            foreach (var entry in archive.Entries)
            {
                entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
            }
            archive.Dispose();
        });
    }

2- Diese Methode funktioniert mit Zip-Dateistream

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
    {
        string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
        using (FileStream output = new FileStream(filePath, FileMode.Create))
        {
            await zipFile.CopyToAsync(output);
        }
        await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
        await Task.Run(() => File.Delete(filePath));
    }
Quelle