PHP Code:
Alıntı:
//Dosya sıkıştırmak
icin :
Function CompressFile(FileName,CompressedFileName:String): Byte;
Var
InFile,OutFile:TFileStream;
Comp:TCompressionStream;
Begin
Try
InFile:=TFileStream.Create(FileName,fmOpenRead);
// Sıkıştırılacak dosya acılıyor
Except
//Dosyayı acamadık. Hata verip
cıkacağız.
Result:=01;
Exit;
End;
Try
OutFile:=TFileStream.Create(CompressedFileName,
fmCreate);
// Kaydedilecek dosya yaratılıyor
Except
// Cıkış dosyası yaratılamadı. Hata verip cıkacağız.
Result:=02;
InFile.Free;
//Actığımız stream'i kapamayı unutmuyoruz.
Exit;
End;
Try
Comp:=TCompressionStream.Create(clMax,OutFile);
// Sıkıştırma icin kullanılacak olan stream yaratılıyor.
// bu stream'in kodunu zlib.pas dosyasında bulabilirsiniz.
// stream'ler ile ilgili daha detaylı bilgi icin
// Delphi help'te TStream konusunu aratın.
Except
//Dosyalar ile ilgili bir problemimiz yok, ama sıkıştırma işlemini
//gercekleştiremedik. Hata verip cıkıyoruz.
Result:=03;
InFile.Free; // Actığımız tum stream'leri kapıyoruz.
OutFile.Free;
Exit;
End;
Result:=00; //Sonucu herşey iyiymiş gibi ayarlıyoruz.
Try
Comp.CopyFrom(InFile,0);
// InFile stream'inin iceriğini sonuna kadar Comp'a kopyalıyoruz.
//TCompression sınıfının
dolayısı ile Comp'un ozelliği icine yazılması
//sırasında yazılan bilgiyi otomatik olarak sıkıştırmasıdır. Yani bu
//kopyalama sırasında aynı
zamanda bilgiyi sıkıştırmışta olduk.
//Kolay değilmi ?
//Eğer Comp.OnProgress event'ına bir procedure atayacak olursanız
aynı
//zamanda işlemin devamı sırasında otomatik olarak belirli aralıklarla
//istediğiniz bir procedure'u calıştırabilirsiniz. Bu da size bir
progressbar'ı
//ilerletmeniz icin yardımcı olur.
Except
Result:=04; //Beklediğimiz olmadı. Sonucu hataya gore ayarlıyoruz.
End;
// İşte işimiz bitti. Artık sıkıştırılmış bir dosya elde ettik. (Tabi hata almadıysak)
//tabiki OutFile Free method'unu
cağırına dek bu dosyanın disk uzerine yazıldığından
//emin olamayız. Burada dikkat etmeniz gereken bir nokta daha var. Comp siz onu
//yok edene dek
OutFilew Stream'ini kullanacaktır. Dolayısı ile once Comp'u daha sonra
//OutFile'ı kapatmak zorundasınız.
Comp.Free;
InFile.Free;
OutFile.Free;
End;
//Dosya acmak icin :
Function DecompressFile(FileName,DeCompressedFileName:Strin g):Byte;
Var
InFile,OutFile:TFileStream;
DeComp:TDeCompressionStream;
Buffer:Array[0..4095] Of Byte; //bu acmak icin kullanacağımız gecici bir buffer
Count:Integer;
Begin
Try
InFile:=TFileStream.Create(FileName,fmOpenRead);
// Sıkıştırılmış dosya acılıyor
Except
//Dosyayı acamadık. Hata verip
cıkacağız.
Result:=01;
Exit;
End;
Try
OutFile:=TFileStream.Create(DeCompressedFileName,
fmCreate);
// Kaydedilecek dosya yaratılıyor
Except
// Cıkış dosyası yaratılamadı. Hata verip cıkacağız.
Result:=02;
InFile.Free;
//Actığımız stream'i kapamayı unutmuyoruz.
Exit;
End;
Try
DeComp:=TDeCompressionStream.Create(InFile);
// Acma işlemi icin kullanılacak olan
stream yaratılıyor.
// Decompression sınıfının dolayısı ile DeComp'un ozelliği
// bu stream'den bilgi okunurken otomatik olarak okunma
anında
//bilgi acılır. Bu stream'in kodunu zlib.pas dosyasında bulabilirsiniz.
Except
//Dosyalar
ile ilgili bir problemimiz yok, ama sıkıştırma işlemini
//gercekleştiremedik. Hata verip cıkıyoruz.
Result:=03;
InFile.Free;
// Actığımız tum stream'leri kapıyoruz.
OutFile.Free;
Exit;
End;
Result:=00; //Sonucu herşey iyiymiş gibi ayarlıyoruz.
//Acma işlemi icin farklı bir yontem
kullanmak zorundayız. Cunku
//DeComp bilgiyi biz okurken actığı icin boyutunu onceden hesaplamıyor.
//Bu yuzden ya dosya boyunu dosyayı
sıkıştırırken (ki bu dosya adıda eklendiği
//zaman benim sevdiğim ve kullandığım teknik oluyor.)
//dosyanın en başına ekleyeceğiz,
yada bir hata alana kadar bu stream'den
//okumaya devam edeceğiz (buda zlib ile bereber gelen ornek programdaki teknik)
//ben burada basit olduğu
icin ikinci tekniği kullanacağım.
Repeat
Try
Count:= DeComp.Read(Buffer,SizeOf(Buffer));
//Okuyabildiğimiz kadar veriyi okuyoruz. Count
okuduğumuz toplam
//byte sayısını tutuyor.
If Count
0 Then OutFile.WriteBuffer(Buffer,
Count);
//Eğer veri okuyabildiysek (ki verilerin sonuna gelene kadar okuyacağız)
//bunu OutFile'a yazıyoruz.
Except
Result:=04;
Count:=0;
//Hata oluştu. Hata kodunu ayarlıyoruz, ve count'u donguden cıkmak icin sıfırlıyoruz.
End;
Until Count=0;
// İşte işimiz bitti. Artık acılmış
dosyayı elde ettik. (Tabi hata almadıysak)
//tabiki OutFile Free method'unu cağırına dek bu dosyanın disk uzerine yazıldığından
//emin olamayız.
Yine once Decomp'u bırakıyoruz.
DeComp.Free;
InFile.Free;
OutFile.Free;
End;
icin :
Function CompressFile(FileName,CompressedFileName:String): Byte;
Var
InFile,OutFile:TFileStream;
Comp:TCompressionStream;
Begin
Try
InFile:=TFileStream.Create(FileName,fmOpenRead);
// Sıkıştırılacak dosya acılıyor
Except
//Dosyayı acamadık. Hata verip
cıkacağız.
Result:=01;
Exit;
End;
Try
OutFile:=TFileStream.Create(CompressedFileName,
fmCreate);
// Kaydedilecek dosya yaratılıyor
Except
// Cıkış dosyası yaratılamadı. Hata verip cıkacağız.
Result:=02;
InFile.Free;
//Actığımız stream'i kapamayı unutmuyoruz.
Exit;
End;
Try
Comp:=TCompressionStream.Create(clMax,OutFile);
// Sıkıştırma icin kullanılacak olan stream yaratılıyor.
// bu stream'in kodunu zlib.pas dosyasında bulabilirsiniz.
// stream'ler ile ilgili daha detaylı bilgi icin
// Delphi help'te TStream konusunu aratın.
Except
//Dosyalar ile ilgili bir problemimiz yok, ama sıkıştırma işlemini
//gercekleştiremedik. Hata verip cıkıyoruz.
Result:=03;
InFile.Free; // Actığımız tum stream'leri kapıyoruz.
OutFile.Free;
Exit;
End;
Result:=00; //Sonucu herşey iyiymiş gibi ayarlıyoruz.
Try
Comp.CopyFrom(InFile,0);
// InFile stream'inin iceriğini sonuna kadar Comp'a kopyalıyoruz.
//TCompression sınıfının
dolayısı ile Comp'un ozelliği icine yazılması
//sırasında yazılan bilgiyi otomatik olarak sıkıştırmasıdır. Yani bu
//kopyalama sırasında aynı
zamanda bilgiyi sıkıştırmışta olduk.
//Kolay değilmi ?
//Eğer Comp.OnProgress event'ına bir procedure atayacak olursanız
aynı
//zamanda işlemin devamı sırasında otomatik olarak belirli aralıklarla
//istediğiniz bir procedure'u calıştırabilirsiniz. Bu da size bir
progressbar'ı
//ilerletmeniz icin yardımcı olur.
Except
Result:=04; //Beklediğimiz olmadı. Sonucu hataya gore ayarlıyoruz.
End;
// İşte işimiz bitti. Artık sıkıştırılmış bir dosya elde ettik. (Tabi hata almadıysak)
//tabiki OutFile Free method'unu
cağırına dek bu dosyanın disk uzerine yazıldığından
//emin olamayız. Burada dikkat etmeniz gereken bir nokta daha var. Comp siz onu
//yok edene dek
OutFilew Stream'ini kullanacaktır. Dolayısı ile once Comp'u daha sonra
//OutFile'ı kapatmak zorundasınız.
Comp.Free;
InFile.Free;
OutFile.Free;
End;
//Dosya acmak icin :
Function DecompressFile(FileName,DeCompressedFileName:Strin g):Byte;
Var
InFile,OutFile:TFileStream;
DeComp:TDeCompressionStream;
Buffer:Array[0..4095] Of Byte; //bu acmak icin kullanacağımız gecici bir buffer
Count:Integer;
Begin
Try
InFile:=TFileStream.Create(FileName,fmOpenRead);
// Sıkıştırılmış dosya acılıyor
Except
//Dosyayı acamadık. Hata verip
cıkacağız.
Result:=01;
Exit;
End;
Try
OutFile:=TFileStream.Create(DeCompressedFileName,
fmCreate);
// Kaydedilecek dosya yaratılıyor
Except
// Cıkış dosyası yaratılamadı. Hata verip cıkacağız.
Result:=02;
InFile.Free;
//Actığımız stream'i kapamayı unutmuyoruz.
Exit;
End;
Try
DeComp:=TDeCompressionStream.Create(InFile);
// Acma işlemi icin kullanılacak olan
stream yaratılıyor.
// Decompression sınıfının dolayısı ile DeComp'un ozelliği
// bu stream'den bilgi okunurken otomatik olarak okunma
anında
//bilgi acılır. Bu stream'in kodunu zlib.pas dosyasında bulabilirsiniz.
Except
//Dosyalar
ile ilgili bir problemimiz yok, ama sıkıştırma işlemini
//gercekleştiremedik. Hata verip cıkıyoruz.
Result:=03;
InFile.Free;
// Actığımız tum stream'leri kapıyoruz.
OutFile.Free;
Exit;
End;
Result:=00; //Sonucu herşey iyiymiş gibi ayarlıyoruz.
//Acma işlemi icin farklı bir yontem
kullanmak zorundayız. Cunku
//DeComp bilgiyi biz okurken actığı icin boyutunu onceden hesaplamıyor.
//Bu yuzden ya dosya boyunu dosyayı
sıkıştırırken (ki bu dosya adıda eklendiği
//zaman benim sevdiğim ve kullandığım teknik oluyor.)
//dosyanın en başına ekleyeceğiz,
yada bir hata alana kadar bu stream'den
//okumaya devam edeceğiz (buda zlib ile bereber gelen ornek programdaki teknik)
//ben burada basit olduğu
icin ikinci tekniği kullanacağım.
Repeat
Try
Count:= DeComp.Read(Buffer,SizeOf(Buffer));
//Okuyabildiğimiz kadar veriyi okuyoruz. Count
okuduğumuz toplam
//byte sayısını tutuyor.
If Count
0 Then OutFile.WriteBuffer(Buffer,
Count);
//Eğer veri okuyabildiysek (ki verilerin sonuna gelene kadar okuyacağız)
//bunu OutFile'a yazıyoruz.
Except
Result:=04;
Count:=0;
//Hata oluştu. Hata kodunu ayarlıyoruz, ve count'u donguden cıkmak icin sıfırlıyoruz.
End;
Until Count=0;
// İşte işimiz bitti. Artık acılmış
dosyayı elde ettik. (Tabi hata almadıysak)
//tabiki OutFile Free method'unu cağırına dek bu dosyanın disk uzerine yazıldığından
//emin olamayız.
Yine once Decomp'u bırakıyoruz.
DeComp.Free;
InFile.Free;
OutFile.Free;
End;
__________________