Komprimieren / Dekomprimieren von Ordnern und Dateien

stimmen
42

Kennt jemand eine gute Möglichkeit, um Dateien und Ordner in C # schnell zu komprimieren oder zu dekomprimieren? große Dateien Handhabung erforderlich sein könnte.

Veröffentlicht am 01/08/2008 um 18:13
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

stimmen
24

Der .NET 2.0 Framework - Namespace System.IO.Compressionunterstützt GZIP und Deflate - Algorithmen. Hier sind zwei Methoden , die einen Byte - Strom komprimieren und dekomprimieren , die Sie von Ihrem Dateiobjekt erhalten können. Sie können subsitute GZipStreamfür die DefaultStreamin den Verfahren unter diesen Algorithmus zu verwenden. Dies lässt nach wie vor das Problem , obwohl Dateien komprimiert mit unterschiedlichen Algorithmen Handhabung.

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();
}
Beantwortet am 05/08/2008 um 13:04
quelle vom benutzer

stimmen
21

Ich habe früher immer die SharpZip Bibliothek.

Hier ist ein Link

Beantwortet am 01/08/2008 um 18:30
quelle vom benutzer

stimmen
10

Ab .NET 1.1 die einzige verfügbare Methode erreicht in die Java - Bibliotheken.
Unter Verwendung der Zip - Klassen in den J # Klassenbibliotheken Komprimieren von Dateien und Daten mit C #
nicht sicher , ob dies in der letzten Versionen geändert hat.

Beantwortet am 01/08/2008 um 18:28
quelle vom benutzer

stimmen
8

Meine Antwort würde Ihre Augen schließen und entscheiden sich für DotNetZip . Es wurde von einer großen Gemeinschaft getestet.

Beantwortet am 17/11/2013 um 17:08
quelle vom benutzer

stimmen
8

Sie können eine verwenden 3rd-Party - Bibliothek wie SharpZip wie Tom hingewiesen.

Eine weitere Möglichkeit (ohne 3rd-Party gehen) ist die Windows-Shell-API zu verwenden. Sie werden einen Verweis auf die Microsoft Shell Bedienelemente und Automation COM-Bibliothek in C # Projekt festlegen müssen. Gerald Gibson hat ein Beispiel an:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

Internet Archive Kopie der Toten Seite

Beantwortet am 01/08/2008 um 19:04
quelle vom benutzer

stimmen
6

GZipStream ist ein wirklich gutes Programm zu verwenden.

Beantwortet am 13/05/2012 um 03:01
quelle vom benutzer

stimmen
6

Dies ist sehr einfach in Java zu tun, und wie oben erwähnt, die Sie in die java.util.zip Bibliotheken von C # erreichen. Für Referenzen finden Sie unter:

java.util.zip javadocs
Beispielcode

Früher habe ich dies vor einer Weile ein tiefes (rekursiv) zip eine Ordnerstruktur zu tun, aber ich glaube nicht, dass ich jemals das Aufgehen verwendet. Wenn ich so motiviert bin kann ich diesen Code herausziehen und bearbeiten sie in hier später.

Beantwortet am 05/08/2008 um 00:52
quelle vom benutzer

stimmen
5

Eine weitere gute Alternative ist auch DotNetZip .

Beantwortet am 08/12/2011 um 23:29
quelle vom benutzer

stimmen
0

Sie können Zip-Datei mit dieser Methode 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 ZIP - Datei mit diesem Verfahren entpacken
1- diese Methode Arbeit mit Zip - Datei - Pfad

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 Arbeit mit Zip-Datei-Stream

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));
    }
Beantwortet am 09/01/2018 um 18:35
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more