C# - Egyéb tömörtési lehetőségek

Fájltömörítés 2. rész

forráskód letöltése
Sorozatunk előző számában megismerkedhettünk a fájltömörítés egyik módszerével, melyben a Microsoft J# futtatórendszer osztályait vettük igénybe a cél eléréséhez. A második részt egy, a Microsoft megoldással nem összefüggő lehetőség bemutatásának szenteljük. A fájljainkat itt is képesek vagyunk be- és kitömöríteni, és a tömörítés szintjét is meg tudjuk adni.
A mellékelt példa használata előtt az ICSharpCode.SharpZipLib nevű referencia elérési útját módosítani kell a DLL aktuális elérési útvonalára. Ezzel kapcsolatban további információkat a Kezdeti beállítások című szakaszban olvashat.
Kezdeti beállítások
A mellékelt példában egy olyan C#-ban megírt osztálykönyvtárat használunk fel, mely nyílt forráskódú és bizonyos feltételek betartása mellett szabadon felhasználható, az alkalmazások kódjába beépíthető.
A cikk írásakor a dinamikus könyvtár a következő címről volt letölthető, mely azóta természetesen megváltozhatott:
http://prdownloads.sourceforge.net/sharpdevelop/050SharpZipLib.zip?download.
A letöltés után a 050SharpZipLib.zip állományt ki kell csomagolnunk, majd – amennyiben a GAC-ból szeretnénk elérni az assembly-t – regisztrálnunk kell az assembly-t a Global Assembly Cache tárban. A regisztráció érdekében indítson el egy Visual Studio.NET parancssort (Start menü), majd a GACUTIL.EXE segédprogram felhasználásával végezze el a regisztrációt.
gacutil /i <DLL elérési útvonala>
Ellenkező esetben a kicsomagolt állományt kell referenciaként a projekthez adnunk. Ezt követően a megnyitott projektet már csak le kell fordítani.
Állományok csomagolása
A program funkcionalitása megegyezik az előző számban közölt programéval, csupán a felhasznált osztályok különbözők. A metódusokat a ZipClass osztályban implementáltuk.
A csomagolást a ZipFiles metódus segítségével valósítjuk meg, paraméterként adva meg a csomagolt fájlnevet, a csomagolandó állományok neveit, valamint a csomagolás szintjét jelző egész számot, mely 0 és 9 között lehet. A 0 érték a legkisebb, míg a 9 érték a legnagyobb tömörítést és egyben a legnagyobb helymegtakarítást eredményezi.
A metódusban a következőket tesszük:
Szükség van egy Crc32 objektumra, hogy egy ellenőrző szám kerüljön a csomagolt állomány fejlécébe. Ellenkező esetben abba a problémába ütközhetünk, hogy a fejléc nem fog ellenőrzőösszegre vonatkozó információt tartalmazni, így az ezt is ellenőrző csomagoló-alkalmazások nem tudják azt kezelni.
Crc32 c = new Crc32();
Létrehozunk egy ZipOutputStream objektumot, mely a tömörített állomány adatfolyama lesz.
ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipname));
Megadjuk a tömörítés szintjét.
zipStream.SetLevel(level);
Majd a fájllista elemein végigmenve mindegyiket egy ZipEntry objektumként elhelyezzük az adatfolyamban.
foreach (string file in files) 
{
  FileStream fs = File.OpenRead(file);
  byte[] buffer = new byte[fs.Length];
  fs.Read(buffer, 0, buffer.Length);
  ZipEntry entry = new ZipEntry(file);
  ...
  entry.Crc = c.Value;
  zipStream.PutNextEntry(entry);
  zipStream.Write(buffer, 0, buffer.Length);
}
A kicsomagolást az ExtractZipFile metódussal végezzük. A metódusban egy ZipInputStream objektumot hozunk létre.
ZipInputStream zippedStream = new ZipInputStream(File.OpenRead(zipfile));
Megvizsgáljuk az adatfolyam ZipEntry bejegyzéseit, és mindet egy-egy saját fájl-adatfolyamba írjuk egy StreamWriter objektum segítségével.
while ((e = zippedStream.GetNextEntry()) != null) 
{
  FileStream sw = File.Create(directory + "\\" + f);
  ...
  sw.Write(data, 0, size);
  ...
Az osztályunk még egy statikus metódust tartalmaz, mely a csomagolt állományból kiolvassa a csomagolt elemeket, és elhelyezi őket egy ArrayList listában, melyet majd a megfelelő helyen feldolgozunk. A metódus neve GetZippedFiles.
Az alkalmazás Form-ján minden kezelőfunkciót a sorozat első részében használt program mintájára készítettünk el, így a működése teljesen megegyezik az ott használható működéssel.
A csomagolt állomány a projekt mappájába kerül, míg a kicsomagolás egy tetszőleges, a KICSOMAGOL fül alatt megadható mappába.

Fájltömörítés cikksorozat

Állományok tömörítése - Fájltömörítés 1. rész

Egyéb tömörtési lehetőségek - Fájltömörítés 2. rész