Kompresję / dekompresję plików i folderów

głosy
42

Czy ktoś wie o dobrym sposobem do kompresji lub dekompresji plików i folderów w języku C # szybko? Obsługi dużych plików może być konieczne.

Utwórz 01/08/2008 o 18:13
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
10

Począwszy od .NET 1.1 jedyną dostępną metodą jest dotarcie do bibliotek Java.
Używanie klas pocztowe w J # Class Libraries do kompresji plików i danych z C #
Nie wiem, czy to się zmieniło w ostatnich wersjach.

Odpowiedział 01/08/2008 o 18:28
źródło użytkownik

głosy
21

Zawsze stosować Bibliotekę SharpZip.

Oto link

Odpowiedział 01/08/2008 o 18:30
źródło użytkownik

głosy
8

Można użyć biblioteki 3rd firm takich jak SharpZip jak Tom zauważył.

Innym sposobem (bez przechodzenia 3rd-party) jest użycie interfejsu API systemu Windows Shell. trzeba ustawić odwołanie do formantów Microsoft Shell i biblioteki Automatyzacji COM w projekcie C #. Gerald Gibson ma przykład w:

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

kopia Internet Archive za zmarłego stronie

Odpowiedział 01/08/2008 o 19:04
źródło użytkownik

głosy
6

Jest to bardzo proste do wykonania w Javie, i jak stwierdzono powyżej można dotrzeć do bibliotek java.util.zip z C #. O referencje patrz:

java.util.zip Javadocs
przykładowy kod

Kiedyś to jakiś czas temu, aby zrobić głęboki (zip) rekurencyjnej struktury folderów, ale nie sądzę, bym kiedykolwiek użył rozpakowaniu. Jeśli jestem tak zmotywowani mogę wyciągnąć z tego kodu i edytować go w tutaj później.

Odpowiedział 05/08/2008 o 00:52
źródło użytkownik

głosy
24

Przestrzeń nazw .NET Framework 2.0 System.IO.Compressionobsługuje algorytmy gzip i opróżnić. Oto dwie metody kompresji i dekompresji strumień bajtów, które można uzyskać od obiektu pliku. Można subsitute GZipStreamdla DefaultStreamw metodach poniżej, aby używać tego algorytmu. To nadal pozostawia problem obsługi plików skompresowanych różnymi algorytmami chociaż.

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();
}
Odpowiedział 05/08/2008 o 13:04
źródło użytkownik

głosy
5

Innym dobrym rozwiązaniem jest również DotNetZip .

Odpowiedział 08/12/2011 o 23:29
źródło użytkownik

głosy
6

GZipStream jest naprawdę dobre narzędzie do wykorzystania.

Odpowiedział 13/05/2012 o 03:01
źródło użytkownik

głosy
8

Moja odpowiedź będzie zamknąć oczy i wybrać DotNetZip . Przetestowano go przez dużą społeczność.

Odpowiedział 17/11/2013 o 17:08
źródło użytkownik

głosy
0

można utworzyć plik zip z tą metodą:

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

a następnie można rozpakować plik zip z tych metod:
1- tej metody pracy z ścieżki pliku zip

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

Praca 2- ten sposób ze strumienia zip

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));
    }
Odpowiedział 09/01/2018 o 18:35
źródło użytkownik

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