Kompresja danych w .NET 4.5 – klasa ZipFile

W starszych wersjach .NET, do dyspozycji był m.in. strumień GZipStream. Do prostych zastosować wystarczał ale zwykle, trzeba było opakowywać go w swoje klasy, aby np. skompresować cały folder.

Od .NET 4.5 mamy klasę ZipFile, która dostarcza kilka przydatnych metod. Najpierw należy dodać referencję do System.IO.Compression.FileSystem, a potem wystarczy skorzystać jednej ze statycznych metod, np.:

string startPath = @"c:\setup\ToZip";
string zipPath = @"c:\setup\result.zip";
string extractPath = @"c:\setup\extracted";

ZipFile.CreateFromDirectory(startPath, zipPath);

ZipFile.ExtractToDirectory(zipPath, extractPath);

CreateFromDirectory dokonuje kompresji wskazanego folderu. Z kolei ExtractToDirectory dekompresuje dany plik zip. API jest naprawdę proste i przejrzyste.

Do dyspozycji mamy również metodę Open, służącą do otworzenia archiwum w celu modyfikacji lub po prostu odczytu plików.

Przykład:

using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Read))
{
 foreach (var entry in archive.Entries)
 {
     Console.WriteLine(entry.Name);
     Console.WriteLine(entry.LastWriteTime);
 }
}    

Możliwe jest również dodanie pliku do już istniejącego archiwum:

string zipPath = @"c:\users\exampleuser\start.zip";
string newFile = @"c:\users\exampleuser\NewFile.txt";

using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
{
    archive.CreateEntryFromFile(newFile, "NewEntry.txt");
}

Warto przyjrzeć się dostępnym metodom, ale generalnie większość operacji, których potrzebujemy przy pracy z kompresją plików jest dostępnych. Możliwe jest np. wypakowanie pojedynczego pliku:

using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Read))
{
 foreach (var entry in archive.Entries)
 {
    entry.ExtractToFile(Path.GetTempPath());
 }
}             

Co prawda od dawna były dostępne już biblioteki dla C#, ale fajnie, że nie trzeba już szukać ich po za standardową biblioteką.

3 thoughts on “Kompresja danych w .NET 4.5 – klasa ZipFile”

  1. Fajnie, a co z kompresją danych bez zapisywania pliku na dysk? Np. tablic bajtów, memory streamów itd.?
    Bez obsługi strumieni ta klasa jest średnio przydatna. Bo czy np. mając aplikację na IISie bawić się w pliki i ścieżki tymczasowe?

  2. Hej!

    Z mojej perspektywy widać postęp pomiędzy wersjami .Net Framework ale brakuje jeszcze obsługi plików zip zabezpieczonych hasłem.

    Pozdrawiam
    Grzesiek P.

Leave a Reply

Your email address will not be published.