Yazılım Mimarileri ve Tasarım Desenleri Üzerine

C# – System.IO.Packaging Kütüphanesi İle Dosya Sıkıştırma

Uzun süredir C#’ta dosya sıkıştırma konusunu araştırmakta olduğumdan dolayı şahsi kanaatim bu konu üzerine net bir açıklama yapan pek bir kaynak bulunmadığından yanadır.Bu yazımda sizlere çok güzel bir dosya sıkıştırma tekniği göstereceğim.İşin güzel yanı bu yazımdan sonraki iki yazımda da C#’ta sıkıştırma tekniklerini ele alacağız.Yani üç farklı teknikle aynı işlemi inceleyeceğimizi umuyorum.

Şimdi hızlı bir şekilde C#’ta System.IO.Packaging kütüphanesiyle bir dosya teknik olarak nasıl sıkıştırılır inceleyelim.

System.IO.Packaging kütüphanesini kullanabilmek için projenizde hazırlamamız gereken tek husus “WindowsBase.dll” dosyasını projenize entegre etmenizdir.Bu işlem için projenize sağ tıklayarak “Add” -> “Reference” kombinasyonunu takip ediniz.

Açılan pencerede soldaki “Assemblies” kategegorisinden “Framework” kategorisini seçin ve “WindowsBase” isimli dosyayı projenize dahil etmek için kutucuğuna işaret koyup “OK” butonuna tıklayınız.

Sıkıştırma sınıfını rahat ve esnek yazabilmek için iki adet Base Class oluşturacağız.

    public abstract class ArchiveObj
    {
        internal String strPath;
        internal List<String> lError;
        internal List<String> lFiles;
        public String[] ErrorList
        {
            get
            {
                return lError.ToArray();
            }
        }
        public ArchiveObj()
        {
            lFiles = new List<string>();
            lError = new List<string>();
        }
        public Boolean AddFile(String strFile)
        {
            lFiles.Add(strFile);
            return true;
        }
        public abstract int SaveArchive();
    }
    public abstract class ArchiveCreator
    {
        internal String strPath;
        public abstract ArchiveObj GetArchieve();
    }

Yukarıda gördüğünüz gibi “ArchiveObj” ve “ArchiveCreator” isimlerinde iki adet abstract sınıf oluşturduk.Bu sınıfları Base Class olarak kullanacağız.Sınıfların işleyişini burada uzun uzun bahsetmektense sizlerin incelemenizi tavsiye ediyorum.Lakin bu iki sınıfı benzer ya da birebir oluşturmanız amacımıza yeterince hizmet etmiş olacaktır.

Şimdi gelelim sıkıştırma işlemini yapacak program komutlarına.

    class WinBaseZip : ArchiveObj
    {
        private WinBaseZip() { }
        public WinBaseZip(String sPath)
        {
            strPath = sPath;
        }
        public override int SaveArchive()
        {
            foreach (String strFile in lFiles)
                zipFile(strFile);
            if (lError.Count > 0)
            {
                if (lError.Count < lFiles.Count)
                    return 0;
                else
                    return -1;
            }
            return 1;
        }
        private bool zipFile(String strFile)
        {
            PackagePart pkgPart = null;
            using (Package Zip = Package.Open(strPath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
            {
                String strTemp = strFile.Replace(" ", "_");
                String zipURI = String.Concat("/", System.IO.Path.GetFileName(strTemp));
                Uri parturi = new Uri(zipURI, UriKind.Relative);
                try
                {
                    pkgPart = Zip.CreatePart(parturi, System.Net.Mime.MediaTypeNames.Application.Zip, CompressionOption.Normal);
                }
                catch (Exception ex)
                {
                    lError.Add(strFile + "; Error : " + ex.Message);
                    return false;
                }
                Byte[] bites = System.IO.File.ReadAllBytes(strFile);
                pkgPart.GetStream().Write(bites, 0, bites.Length);
                Zip.Close();
            }
            return true;
        }
    }
    public class WinBaseZipCreator : ArchiveCreator
    {
        private WinBaseZipCreator() { }
        public WinBaseZipCreator(String sPath)
        {
            strPath = sPath;
        }
        public override ArchiveObj GetArchieve()
        {
            return new WinBaseZip(strPath);
        }
    }

Yukarıda da gördüğünüz gibi “WinBaseZip” ve “WinBaseZipCreator” isimlerinde iki adet sınıf oluşturduk.”WinBaseZip” isimli sınıfımız “ArchiveObj” sınıfından, “WinBaseZipCreator” sınıfı ise “ArchiveCreator” sınıfından kalıtım almaktadır.Tabi bu arada “PackagePart” referansını kullanabilmek için “System.IO.Packaging” kütüphanesini kod sayfasına çağırmanız gerekmektedir.

Yukarıdaki sınıfların işlevlerinden de bahsetmem pek mümkün değildir.En azından internette ki sıkıştırma makalelerine nazaran bu komutlar ciddi işlev görmekte ve son aşamadaki kullanımları çok basit olmaktadır.

Son aşama demişken, artık sıkıştırma işlemini yapacak yazılımımızı bitirdik.Şimdi tek yapmamız gereken son aşama olan bu sınıfları kullanarak sıkıştırma işlemini gerçekleştirmek.

        private void Form1_Load(object sender, EventArgs e)
        {
            ArchiveCreator ss = new WinBaseZipCreator(@"D:\Deneme\arsiv.zip");
            ArchiveObj xx = ss.GetArchieve();
            xx.AddFile(@"D:\Deneme\a.txt");
            xx.AddFile(@"D:\Deneme\b.PNG");
            xx.AddFile(@"D:\Deneme\c.docx");
            xx.SaveArchive();
        }

Gördüğünüz gibi artık dosyalarımızı bu şekilde basit bir kullanımla sıkıştırabilmekteyiz.
Program çalıştırılmadan önce “D:\Deneme” dizininin görüntüsü,

Program çalıştırıldıktan sonra “D:\Deneme” dizininin görüntüsü,

Oluşturulan “arsiv.zip” dosyasının içeriği,

Dosyaları arşivden çıkarıp çalışıp çalışmadığınıda sizler kontrol ediniz 🙂

C# Dosya Sıkıştırma Örnek Proje

Sonraki yazılarımda görüşmek dileğiyle…
İyi çalışmalar…

Exit mobile version