Artykuł

sxc.hu sxc.hu
maj 01 2013
0

Biblioteki warte poznania w C# - SevenZipSharp

Świat się zmienia. Obecnie moc obliczeniowa nie jest takim problem jak kiedyś, co chyba najlepiej odzwierciedla pewnego rodzaju stagnacja na rynku komputerowym. Podobnie sprawa ma się z przestrzenią dyskową. Kiedy sobie przypomnę mój pierwszy komputer, w którym dysk miał 20MB, to pamiętam że miałem dylemat - instalować Windowsa 3.1, czy zainstalować więcej gier;-)

Trochę inne były wtedy to czasy. Pamiętam również, że gdzieś pod koniec lat 90-siątych na dobre rozpoczęła się walka formatów do kompresji. Przez długi czas dominował zip, ale po pewnym czasie szala zwycięstwa zaczęła się przechylać w kierunku rara. Podejrzewam, że spory wpływ mogli mieć na to piraci, ponieważ swego rodzaju standardem na scenie stały się wydania kompresowane właśnie rarem.

W ostatnich latach znowu zaczyna się coś dziać na rynku pakerów, a to głównie za sprawą formatu 7z, który oferuje znacznie lepszy algorytmy kompresji, a na dodatek aplikacja do jego obsługi dostępna jest za darmo.

Niestety w .Net brakuje natywnego wsparcia dla tego formatu, ale od czego mamy niezależnych programistów i biblioteki;-)?

W dzisiejszym wpisie chciałbym Wam przedstawić remedium dla tego problemu, czyli SevenZipSharp.

Charakterystyka i zastosowanie

Na początek małe wyjaśnienie. SevenZipSharp nie jest do końca biblioteką, ale swego rodzaju wrapperem (jest na to jakieś ładne polskie słowo?) opakowującym natywną DLLkę 7-zipa. Oznacza to, że do poprawnej pracy wymagany jest pliczek SevenZipSharp.dll, który dodajemy jako referencję do naszego .Netowego projektu oraz pliki 7z.dll lub 7z64.dll, które powinny się znajdować najlepiej w tej samej lokalizacji co wyżej wspominana DLLka (ścieżki do biblioteki można ustawić za pomocą odpowiednich właściwości statycznych). Wszystkie niezbędne pliki pobierzecie ze strony projektu.

Biblioteka przeznaczona jest zarówno do 32 jak i 64 bitowej architektury i jako minimum wymaga .Neta w wersji 2.0.

Oprócz tytułowego 7-zipa biblioteka wspiera również poniższe formaty:

Xz, Zip, GZip, BZip2, Tar

Czyli można powiedzieć, że jest całkiem nieźle;-)

Piętą achillesową tej biblioteki jest jej dokumentacja, której najogólniej rzec biorąc nie ma. Na szczęście wszystkie nazwy metod i właściwości są dość czytelne, a w kodzie źródłowym, który można przejrzeć/pobrać ze strony projektu, znajdziecie również pewną dozę komentarzy.

Kiedy warto zastosować SevenZipSharp?

W tym przypadku wydaje się to być dość jasne - w sytuacji gdy ilość danych przetwarzanych przez Twój program Cię przytłacza;-)

Kompresję warto również rozważyć w przypadku jakiejkolwiek komunikacji sieciowej, lub w sytuacji gdy mamy dużo plików - przekazanie jednego archiwum w takim przypadku będzie dużo łatwiejsze;-)

SevenZipSharp może być także pewnym środkiem bezpieczeństwa, ponieważ obsługiwane przez niego archiwa mogą mieć hasła.

Przykład praktyczny

SevenZipSharp posiada zasadniczo dwie główne klasy:

  • SevenZipCompressor
  • SevenZipExtractor

Jak nie trudno się domyślić pierwsza odpowiada za kompresję, a druga za coś zupełnie przeciwnego;-)

W obu przypadkach użycie jest banalnie proste. Żeby skompresować przykładowy katalog, wystarczy napisać mniej więcej taki kod:

try
{
    SevenZipCompressor compressor = new SevenZipCompressor();
    compressor.CompressDirectory(@"d:\Test", @"d:\archive.7z");
    Console.WriteLine("Spakowane!");
}
catch (Exception ex)
{
    Console.WriteLine("Błąd: {0}", ex.Message);
}
Console.ReadKey();

Kluczowy w tym przypadku kod to zaledwie dwie linijki. Metoda CompressDirectory przyjmuje katalog do kompresji oraz ścieżkę wyjściową do archiwum. Alternatywnie możemy skompresować tablicę określonych plików korzystając z metody CompressFiles.

Format kompresji możemy zmienić przypisując odpowiednią wartość właściwości ArchiveFormat, która jest enumeracją. IntelliSense z Visual Studio z pewnością przedstawi Wam wszystkie dostępne tutaj możliwości;-)

Wcześniej wykonane archiwum będziemy musieli kiedyś zdekompresować, do czego niewątpliwie walnie przyczyni się poniższy kod:

try
{
    SevenZipExtractor extractor = new SevenZipExtractor(@"d:\archive.7z");
    extractor.ExtractArchive(@"d:\Test2");
    Console.WriteLine("Wypakowane!");
}
catch (Exception ex)
{
    Console.WriteLine("Błąd: {0}", ex.Message);
}
Console.ReadKey();

W tym przypadku do konstruktora przekazujemy ścieżkę do istniejącego archiwum, natomiast do metody ExtractArchive katalog do którego ma trafić wypakowana zawartość.

Oczywiście należy pamiętać o podpięciu referencji do SevenZipSharpa oraz odpowiednim ulokowaniu bibliotek samego 7zipa. W przypadku gdy wrapper będzie mieć problem z odnalezieniem ścieżek do rzeczonych DLLek, polecam użycie statycznej metody SetLibraryPath, która została zdefiniowana dla obu klas.

Ciekawe możliwości

Oprócz standardowych opcji kompresji/dekompresji, SevenZipSharp ma kilka ciekawych opcji. Poniżej lista wybranych pozycji:

  • Tworzenie archiwum ze strumieni - możliwość stworzenia archiwum na podstawie danych będących np. w MemoryStream
  • Kompresja/dekompresja archiwów z hasłem
  • Obsługa wielowątkowości - asynchroniczne metody zaczynające się od Begin...
  • Obsługa archiwów wieloczęściowych
  • Rozpakowywanie archiwów SFX
  • Obsługa różnych poziomów kompresji

Szerszy wykaz możliwości znajduje się oczywiście na stronie projektu;-)

P.S. Po analizie komentarzy z poprzedniego wpisu, pragnę zaznaczyć, że nie uważam tej biblioteki za najlepszą w tym obszarze, ale po prostu korzystałem z niej osobiście i byłem całkiem z niej zadowolony, stąd też moja rekomendacja;-) Ta sama adnotacja dotyczy wszystkich bibliotek pojawiających się w ramach niniejszego cyklu.

Data ostatniej modyfikacji: 30.05.2013, 16:09.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus