Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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.
WindowsBase-dll
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.
windowsbase-dll-yükleme

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ü,
c# ile dosya sıkıştırma
Program çalıştırıldıktan sonra “D:\Deneme” dizininin görüntüsü,
c# ile dosya sıkıştırma 2
Oluşturulan “arsiv.zip” dosyasının içeriği,
c# ile dosya sıkıştırma 3
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…

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. Mahmut dedi ki:

    Merhaba,

    Faydalı paylaşımınız için teşekkürler yalnız bir sorum olacak, “[Content_Types].xml” dosyasının oluşmaması için ne yapmak gerekir?

  2. Kubilay ÇİÇEK dedi ki:

    Merhaba üstad teşekkürler faydalı bir paylaşım işimizi gördü :))

  3. Tutku dedi ki:

    Merhaba bu metodu kullandığımda eğer ziplenecek dosya direkt D:\ altında değilde içindeki klasörlerde olursa (Örn: D:\Klasör1\Klasör2\Klasör3\Deneme.txt) , zipli dosyayı açtığımızda da karşımıza önce Klasör1 çıkıyor içine girince Klasör2 onun da içine girince Klasör3 onun da içinde .txt uzantılı dosyamız oluyor. Ben bu iç içe klasör şekliyle değil de zip dosyasının içerinde dşiret txt’yi görmek istiyorum. Yardım edebilir misiniz

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir