Uyarı :
Projenizde “System” ve “vjslib” referansları ekli olmalıdır.
using System;
using java;
using java.util;
using java.util.zip;
using java.io;
namespace ModifyZip
{
class Program
{
static void Main(string[] args)
{
ZipFile z = new ZipFile(@"C:\Yeni.zip");
Enumeration e = z.entries();
while (e.hasMoreElements())
{
ZipEntry ze = (ZipEntry)e.nextElement();
if (ze.isDirectory())
{
System.IO.Directory.CreateDirectory(@"C:\Temp\" + ze.getName());
}
else
{
if (!System.IO.Directory.Exists(@"C:\Temp\" + System.IO.Path.GetDirectoryName(ze.getName())))
{
System.IO.Directory.CreateDirectory(@"C:\Temp\" + System.IO.Path.GetDirectoryName(ze.getName()));
}
InputStream s = z.getInputStream(ze);
FileOutputStream fos = new FileOutputStream(@"C:\Temp\" + ze.getName());
int size;
sbyte[] data = new sbyte[1024];
while ((size = s.read(data, 0, data.Length)) > 0)
{
fos.write(data, 0, size);
}
fos.close();
}
}
}
}
}
Açıklama :
Diyelim ki C: sürücümüzde “Yeni.Zip” adlı bir sıkıştırılmış dosya olsun. Bu dosyayı açıp içindeki dosyaları ayrıştırmak istediğimizde, Framework 2.0’ın “java” kütüphanesi bize yardımcı olur. Projemize “System” ve “vjslib” referanslarını ekler, uygun namespaceleri kod sayfamıza import ederiz.
using System;
using java;
using java.util;
using java.util.zip;
using java.io;
Bu zip dosyasını Framework’ün “java.util.zip.ZipFile” sınıfını kullanarak kolaylıkla açabiliriz. Bunun için öncelikli olarak ZipFile sınıfından Zipli dosyamın adını belirtecek biçimde bir değişken türetiriz.
ZipFile z = new ZipFile(@"C:\Yeni.zip");
Bu zipli dosyanın içindeki her sıkıştırılmış bilgi, z değişkenin getEntries() metodunun enumerasyonları olacaktır.
Enumeration e = z.entries();
while (e.hasMoreElements())
{
ZipEntry ze = (ZipEntry)e.nextElement();
///
///
}
Bu bilginin içeriğine göre bilginin bir klasör bilgisi mi ya da bir dosya bilgisi mi olduğunu analiz edebilirim. Burada ze.getName() metodundan dönen değer, gelen bilgi bir klasörse klasör adını bir dosya ise dosya adını söyler.
Enumeration e = z.entries();
while (e.hasMoreElements())
{
ZipEntry ze = (ZipEntry)e.nextElement();
if (ze.isDirectory())
{
System.IO.Directory.CreateDirectory(@"C:\Temp\" + ze.getName());
}
else
{
if (! System.IO.Directory.Exists(@"C:\Temp\" + System.IO.Path.GetDirectoryName(ze.getName())))
{
System.IO.Directory.CreateDirectory(@"C:\Temp\" + System.IO.Path.GetDirectoryName(ze.getName()));
}
//
//
}
}
Zipli dosyamızı C: sürücüsünde Temp isimli bir klasörün altına açacak olsaydık, yukarıdaki rutin işimizi görürdü.
Enumerasyondan dönen bilgi bir dosyanın bilgisiyse zipli dosyanın o entry’de ki bilgisini ayrıştırabiliriz.
InputStream s = z.getInputStream(ze);
Bu bilgiyi fiziksel sürücüye yazarak işlemi tamamlarız. Bunun için FileOutputStream sınıfından bir değişken türetiriz ve ayrıştırdığımız bilgiyi diske kaydederiz.
FileOutputStream fos = new FileOutputStream(@"C:\Temp\" + ze.getName());
int size;
sbyte[] data = new sbyte[1024];
while ((size = s.read(data, 0, data.Length)) > 0)
{
fos.write(data, 0, size);
}
fos.close();
Programın çalışmasından sonra “Temp“ klasörüne bakıldığında zipli dosyadan ayrışan dosyalar görülür.
Başka bir makalede görüşmek üzere .
Hasan Altıntaş
Alıntıdır...
Hasan Altıntaş