Friday, March 25, 2016

C# ile Zip Formatında Dosya Sıkıştırma - Zip Formatted File Compression with C#

Bu yazıda .NET framework 4.5 ve üzeri için nasıl zip sıkıştırması yapılacağı anlatılacaktır. Bu yazı kapsamında zip dosyasının içinde yer alan sıkıştırılacak dosya ve zip dosyası hafızada oluşturulacaktır. Elde edilen byte dizisi "File" sınıfı kullanılarak dosya sistemine yazılacaktır. Örnek olarak bir text dosyası oluşturulacak ve bu dosya ziplenecektir.

Zip dosyasının oluşturulması için "ZipArchive" sınıfı kullanılacaktır. Bu sınıfın kullanılabilmesi için  "System.IO.Compression" ve "System.IO.Compression.FileSystem" dll dosyalarına referans verilmelidir. Ayrıca "System.IO.Compression" dll dosyasının versiyonunun eski olmamasına dikkat edilmelidir. Referanslar eklendikten sonra aşağıdaki tanımlama kod sayfasına eklenmelidir.

using System.IO.Compression;

Text dosyasının oluşturulması amacıyla "StringBuilder" sınıfını kullanarak aşağıdaki gibi yazı içeriği oluşturalım:

StringBuilder builder = new StringBuilder();  
builder.AppendLine("Veli");
builder.AppendLine("Yigit");
builder.AppendLine("Yolcu");

Aşağıda yer alan ZipThat fonksiyonuyla zip dosyasının byte dizisi elde edilmektedir. Fonksiyon kullanılarak bir zip arşivi oluşturulmakta ve daha önce hazırladığımız yazı içeriği "ZipArchiveEntry" olarak zip arşivine eklenmektedir. Bu fonksiyon zip verisini "MemoryStream" içinde biriktirmekte ve işlem tamamlandığında sıkıştırılmış içeriği byte dizisi olarak döndürmektedir.

byte[] ZipThat(string FileName, byte[] TxtData)
{
    using (MemoryStream mst = new MemoryStream())
    {
        using (ZipArchive arc = new ZipArchive(mst, ZipArchiveMode.Create))
        {
            var zipEntry = arc.CreateEntry(FileName);

            using (Stream st = zipEntry.Open())
            {
                st.Write(TxtData, 0, TxtData.Length);
            }
        }

        return mst.ToArray();
    }
}

"Encoding" sınıfı kullanılarak StringBuilder" içinde yer alan yazının byte dizisi elde edilebilmektedir:

byte[] txtData = Encoding.Default.GetBytes(builder.ToString());

Son olarak oluşturulan zip verisi "File" sınıfı kullanılarak dosya sistemine yazılmaktadır.

File.WriteAllBytes(string.Format(@"C:\Deneme\{0}.zip", "ZipFile"), ZipThat("FileThatInZipArchive.txt"));

No comments:

Post a Comment