Frage

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.

Keine korrekte Lösung

Andere Tipps

Der .Net 2.0-Framework-Namespace System.IO.Compression unterstützt GZip- und Deflate-Algorithmen.Hier sind zwei Methoden zum Komprimieren und Dekomprimieren eines Bytestroms, den Sie von Ihrem Dateiobjekt erhalten können.Sie können ersetzen GZipStream für DefaultStream in den folgenden Methoden, um diesen Algorithmus zu verwenden.Damit bleibt jedoch immer noch das Problem bestehen, Dateien zu verarbeiten, die mit unterschiedlichen Algorithmen komprimiert wurden.

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();
}

Ich habe immer die SharpZip-Bibliothek verwendet.

Hier ist ein Link

Ab .Net 1.1 ist die einzige verfügbare Methode der Zugriff auf die Java-Bibliotheken.
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.

Sie können a verwenden Bibliothek eines Drittanbieters wie SharpZip wie Tom betonte.

Eine andere Möglichkeit (ohne auf einen Drittanbieter zurückgreifen zu müssen) ist die Verwendung der Windows-Shell-API.Sie müssen in Ihrem C#-Projekt einen Verweis auf die Microsoft Shell Controls and Automation COM-Bibliothek festlegen.Gerald Gibson hat ein Beispiel unter:

Kopie der toten Seite im Internetarchiv

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

GZipStream ist ein wirklich gutes Dienstprogramm.

Dies ist in Java sehr einfach zu bewerkstelligen, und wie oben erwähnt können Sie über C# auf die java.util.zip-Bibliotheken zugreifen.Referenzen finden Sie unter:

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 das Entpacken jemals verwendet habe.Wenn ich so motiviert bin, kann ich den Code herausholen und ihn später hier bearbeiten.

Eine weitere gute Alternative ist auch DotNetZip.

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

Anschließend können Sie die ZIP-Datei mit den 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));
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top