Makale Özeti

ZIP ve RAR dosya sıkıştırma formatları, dosyaları yedeklerken az yer tutması veya verileri taşırken (internet üzerinden veya taşınabilir medyalar vasıtasıyla) taşınabilirliğini arttırmak için en çok kullandıgımız tekniklerdir. Bu makalemizde C# ile ZIP dosyaları nasıl yapılır ve ZIPle sıkıştırılmış dosyalar tekrar nasıl elde edilir onu inceleyecegiz. Ama bunu yaparken bir Visual J# DLL'lerinden faydalanıcaz.

Makale

        Dosyalarımızı ZIP'leyip sıkıştırmak veya tekrar elde etmek için C# da kullanabilecegimiz, bir çok farklı kütüphane olmasına karşılık biz ufak bir hileye başvurup kolay yolunu yapıcaz. Faydalanacagımız [Vjslib.DLL] aslında .Net Framework 1.1 ile beraber gelen bir Visual J# kütüphanesi. Bu kütüphanenin yeri "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322" dir, bu DLL in makinamizda olmaması durumunda elbette programımız işlevini yerine getiremeyecektir. Bu DLL ile bizde Visual J#'ın doğal ZIP desteginden yararlanacagız. Bu yolla dosyalarımızı ZIP lemek ve ZIP den tekrar elde etmenin ne kadar kolay olduğu sizde göreceksiniz.

        İlk olarak yeni projemizi oluşturduktan sonra [Vjslib.DLL] kütüphanemizi projemize referans olarak ekleyelim.

    Referans seçmemiz için açılan pencerede olarak ".NET" sekmesinde göreceksiniz [Vjslib.DLL]i.

 

 

        Referans olarak ekledikten sonra, sıra formumuzu tasarlamaya geldi.

 

        Ben iki radio buton ile programın yapacagı iki ana işlevi ayırt etmeyi uygun gördüm, siz form tasarımında elbette özgürsünüz.

        Ayrıca ZIP'lemek için seçecegimiz dosyaları göstermek ve  ZIP'li dosyaları tekrar elde ederken içerindeki dosyaları görmek için bir ListBox kullandım.
 

 

 

 

 

        Formum aşagıdaki gibidir.

        Bir openfiledialog ve birde savefiledialog kullanarak açacagımız veya sıkıştırdıgımız dosyaların yerini tayin etmek için. Üzerinde Text olmayan buton, 2 yönlü çalıştıgı için ona run-time sırasında isim vericez.

        ZIP'li bir dosyayi tekrar elde ederken btn_yap şöyle şekillenecek:

   
private void btn_yap_Click(object sender, System.EventArgs e)
{
//dosyalarımızı eger ZIP dosyasından çıkartmak istiyorsak
if(rb_unzip.Checked)
{
//okuduklarimizi aktaracagımız bir buffer
sbyte[] buf = new sbyte[1024];

int len;
for (int i = 0; i < lbx_dosyalar.SelectedItems.Count; i++)
{
//dosyanın ismi
string dosya = lbx_dosyalar.SelectedItems[i].ToString();
//java kütüphanesinden dosya okumak icin bir inputstream
java.io.FileInputStream fis = new java.io.FileInputStream(dosyaadi);
//aynı java kütüphanesinden ZIP li dosya okumak icin bir inputstream
java.util.zip.ZipInputStream zis = new java.util.zip.ZipInputStream(fis);
//zip icersiindekiler
java.util.zip.ZipEntry ze;

//zip dosyasinin icindeki butun dosyalari(ZipEntryler) inceliyoruz
while ((ze = zis.getNextEntry()) != null)
{
//eger istedigimiz dosya ise
if (dosya == ze.getName())
{
// Alt dizinleri ile birlikte aliyoruz
int index = dosya.LastIndexOf('/');
if (index > 1)
{
//altdizinlerini buluyoruz
string folder = dosya.Substring(0, index);
DirectoryInfo di = new DirectoryInfo(folder);
// eger dizin yoksa yaratiyoruz
if (!di.Exists)
di.Create();
}
//dosya cıktımız

java.io.FileOutputStream fos = new java.io.FileOutputStream(dosya);
while ((len = zis.read(buf)) >= 0)
{
//yazıyoruz artık
fos.write(buf, 0, len);
}
//dosya hazır
fos.close();
}
}
zis.close();
fis.close();
MessageBox.Show("Zip dosyasi basari ile çıkartildi...","OK",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
//bu kadar
}

        Fakat ZIPli bir dosya oluştururken, ComboBoxdan seçimi yapıldıktan sonra, "..." ile ZIPlemek istedigimiz dosyaları tek tek seçiyoruz, ve listboxa ekliyoruz daha sonra "Ziple" butonuna tikliyoruz o zaman şöyle bir aksiyon gerçekleşiyor, bu yukarıdaki kodun devamıdır;

if(rb_zip.Checked)
{
//sectigimiz dosyalari zip yaparkene
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//kaydederken kullaniciinin istedigi zip dosya ismini alıyoruz
dosyaadi= saveFileDialog1.FileName;
//bu dosyayi oluşturmak için dll den faydalaniyoruz
java.io.FileOutputStream fos = new java.io.FileOutputStream(dosyaadi);
//ZIP doysa olacagini soyluyoruz
java.util.zip.ZipOutputStream zos = new java.util.zip.ZipOutputStream(fos);
//listboxdaki butun dosyalrı aliyoruz
for (int i = 0; i < lbx_dosyalar.Items.Count; i++)
{
string ziplidosyaadi = lbx_dosyalar.Items[i].ToString();
lbx_dosyalar.Text = ziplidosyaadi;
//ZIPlenecek dosyaları okuyoruz
java.io.FileInputStream fis = new java.io.FileInputStream(ziplidosyaadi);
//dosyaları ekliyoruz ama dosya yollarını düzelterek
java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(ziplidosyaadi.Substring(3).Replace('\\','/'));
//ekledik
zos.putNextEntry(ze);
//hafızadaki streamı dosya oluşturup zip olarak kaydedicez
sbyte[] buffer = new sbyte[1024];
int len;
while((len = fis.read(buffer)) >= 0)
{
//yazıyoruz artıkın
zos.write(buffer, 0, len);
}
zos.closeEntry();
fis.close();
}
zos.close();
fos.close();
//bu kadar
MessageBox.Show("ZIP dosyanız hazır...","OK",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
}

        Kodların üstünde comment ile her şeyi açıkladıgım için tekrar burada açıklamaya gerek duymuyorum. Yukarıda nasıl ZIP yaptıgımızı ve nasıl çözdügümüzü incelediniz, ama onlarla birlikte bir kaç işlem daha yapıyoruz, bunlar "..." butonu ile dosyayi seçerken, listboxa dosyalari koymamız ve radio butun seçilmesiyle, işlem butonunu captionun degişmesi gibi;

private void btn_bul_Click(object sender, System.EventArgs e)
{
if
(rb_unzip.Checked)
{
if
(openFileDialog1.ShowDialog() == DialogResult.OK)
{
lbx_dosyalar.Items.Clear();
dosyaadi = openFileDialog1.FileName;
java.io.FileInputStream fis = new java.io.FileInputStream(dosyaadi);
java.util.zip.ZipInputStream zis = new java.util.zip.ZipInputStream(fis);
java.util.zip.ZipEntry ze;

//zip dosyasinin icindeki dosya isimlerini aliyoruz
while
((ze = zis.getNextEntry()) != null)
{
if
(!ze.isDirectory())
{
lbx_dosyalar.Items.Add(ze.getName());
lbx_dosyalar.Items.Add(ze.getSize().ToString());
}
}
 zis.close();
fis.close();
}
}
if
(rb_zip.Checked)
{
if
(openFileDialog1.ShowDialog() == DialogResult.OK)
{
string
dosya = openFileDialog1.FileName;
if
(!mevcutmu(dosya))
{
lbx_dosyalar.Items.Add(dosya);
}
else

MessageBox.Show("Bu dosyayı tekrar ekleyemezsiniz...", Text);
}                
}
}

Unutmayınız ZIPden dosyaları çıkarırken, çıkmasını istediginiz dosyayı listboxdan seçip "Dosyayı cıkar" butonuna basmalısınız.

Hepinize başarılar diliyorum, bir sonraki makalede buluşmak üzere...