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ą.
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?
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.
@michał: naprawdę tego oczekujesz od klasy ZipFile? S jak SOLID…