Merhaba
DB ye tanımladığım Blob alan içerisine bilgiyi kaydetmeden önce ZIP lemek. Daha sonra lazım olduğunda Zip i açarak işlem yapmak istiyorum. 1-2 componente baktım illlaki dosyaya veya dosyadan işlem yapıyor. Herhangi bir dosya kullanmadan bu işlemi yapmam mümkün değil mi?
İyi Çalışmalar
Değişken ZIP
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Değişken ZIP
Turbo power ın AbZipper komponentini kullanabilirsin. Stream içine alarak ziplyebilirsin
Re: Değişken ZIP
AbZipper demolarını inceledim, tamamında dosya ile işlem yapıyor. Kullanımını biliyorsan yazarmısın?
Re: Değişken ZIP
zlib paketi çok güzel yapıyor o işi, şöyle ki;
kullanımı ;
Sıkıştırmak için;
Açmak için ;
ANA.QEVRAKTURU.AsString olarak yazdığım dosya uzantısıdır bende, genelde resim için bmp formatını tavsiye ederim müşterilerime, zira sıkıştırınca boyutu baya azalıyor. jpg zaten sıkıştırılmış format oduğu için zip'lemek pek işe yaramıyor.
Kod: Tümünü seç
uses zlib;
procedure TForm1.CompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf: Pointer;
InpBytes, OutBytes: Integer;
begin
InpBuf := nil;
OutBuf := nil;
try
GetMem(InpBuf, inpStream.Size);
inpStream.Position := 0;
InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finally
if InpBuf <> nil then FreeMem(InpBuf);
if OutBuf <> nil then FreeMem(OutBuf);
end;
end;
procedure TForm1.DecompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf: Pointer;
OutBytes, sz: Integer;
begin
InpBuf := nil;
OutBuf := nil;
sz := inpStream.Size - inpStream.Position;
if sz > 0 then
try
GetMem(InpBuf, sz);
inpStream.Read(InpBuf^, sz);
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
outStream.Write(OutBuf^, OutBytes);
finally
if InpBuf <> nil then FreeMem(InpBuf);
if OutBuf <> nil then FreeMem(OutBuf);
end;
outStream.Position := 0;
end;
Sıkıştırmak için;
Kod: Tümünü seç
var
ACIK, ZIPLI : TMemoryStream;
begin
ACIK := TMemoryStream.Create;
ACIK.LoadFromFile(OpenDialog1.FileName);
ZIPLI := TMemoryStream.Create;
Form1.CompressStream(ACIK,ZIPLI);
end;
Kod: Tümünü seç
VAR
ACIK : TMemoryStream;
ZIPLI : TStream;
begin
ACIK := TMemoryStream.Create;
ZIPLI := ANA.QEVRAK.CreateBlobStream(ANA.QEVRAKRESIM,bmRead);
ZIPLI.SEEK(0,0);
Form1.DecompressStream(ZIPLI,ACIK);
ACIK.SaveToFile('C:\evrak'+ANA.QEVRAKTURU.AsString);
ACIK.Free;
ZIPLI.Free;
end;
Re: Değişken ZIP
bu örneği bulmuştum. fakat
DecompressStream(inpStream, outStream: TStream);
paragrafında
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes); satırı için
[DCC Error] AFatLis.pas(196): E2003 Undeclared identifier: 'DecompressBuf' hatası veriyor.
Delphi XE2 kullanıyorum.
DecompressStream(inpStream, outStream: TStream);
paragrafında
DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes); satırı için
[DCC Error] AFatLis.pas(196): E2003 Undeclared identifier: 'DecompressBuf' hatası veriyor.
Delphi XE2 kullanıyorum.
Re: Değişken ZIP
Undeclared identifier: 'DecompressBuf' hatası veriyor.
tanımlanmamış tanımlayıcı hatası, compress yapıyormu peki?
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes); bunu tanıyorsa onuda tanımalıdır.
bende delphi 7 var sorunsuz kullanıyorum.
tanımlanmamış tanımlayıcı hatası, compress yapıyormu peki?
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes); bunu tanıyorsa onuda tanımalıdır.
bende delphi 7 var sorunsuz kullanıyorum.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Değişken ZIP
Vakti zamanında TAbZipArchive ile çalışmışlığım vardı. Öncelikle şeklinde bir TZipStream sınıfı tanım yapıp bu sınıfı aşağıdaki şekilde kullanmışım.
Kod: Tümünü seç
type
TZipStream = class(TAbZipArchive)
private
procedure ZipHelper(Sender : TObject; Item : TAbArchiveItem; OutStream : TStream);
procedure ZipHelperStream(Sender : TObject; Item : TAbArchiveItem; OutStream, InStream : TStream);
public
constructor CreateFromStream( aStream : TStream; const ArchiveName : string ); override;
end;
....
constructor TZipStream.CreateFromStream(aStream: TStream; const ArchiveName: string);
begin
inherited;
DeflationOption := doMaximum;
CompressionMethodToUse := smDeflated;
InsertHelper := ZipHelper;
InsertFromStreamHelper := ZipHelperStream;
end;
procedure TZipStream.ZipHelper(Sender: TObject; Item: TAbArchiveItem; OutStream: TStream);
begin
AbZip(TAbZipArchive(Sender), TAbZipItem(Item), OutStream);
end;
procedure TZipStream.ZipHelperStream(Sender: TObject; Item: TAbArchiveItem; OutStream, InStream: TStream);
begin
if Assigned(InStream) then
AbZipFromStream(TAbZipArchive(Sender), TAbZipItem(Item), OutStream, InStream);
end;
Kod: Tümünü seç
try
ZipStream:=TZipStream.CreateFromStream(TMemoryStream.Create,'');
{-ZipStream dosyaları (Streamler dosya gibi ele alınır) sıkıştıran dosyayı (Stream'i) bünyesinde barındırır.
-Biz dosyaları (veya Streamleri) sıkıştırdıkça oluşan zip dosyası aslında TMemoryStream.Create ile oluşturduğumuz ZipStream.FStream özelliğinde ortaya çıkmaktadır. Aslında disk ile her hangi bir işlem yapmamaktayız.}
//ZipStream.OnArchiveProgress:=ZipArchiveProgress;
//ZipStream.OnArchiveItemProgress:=ZipArchiveItemProgress;
/////////////
sure:=GetTickCount;
Mem:=TMemoryStream.Create;//bu Mem nesnesi, zip dosyasına sıkışacak bilgileri tutmak için.
try
//ProgressBar1.Position:=0;
//ProgressBar2.Position:=0;
ZipStream.FStream.Size:=0;
ZipStream.Load;
ZipStream.Password:='123456';//zip şifresi vereceksek
//disk dosyaları örneği-->
try{-->bu kısım bir klasördeki dosyaları işler, Stream sorunuz dışındadır ve inceleme amaçlı göz atılabilir ama cevap olarak ele alırsanız görmezden gelebilirsiniz}
ZipStream.BaseDirectory:=Edit1.Text;
ZipStream.AddFiles(Edit2.Text,faAnyFile);//c:\yol\*.* gibi bir filtreye uyan dosyalar
ZipStream.Move(ZipStream.Items[0],'Deneme\Meneme\Dosya.pas');//zip içindeki ilk dosyanın yolunu değiştir
except
on E:Exception do begin
ShowMessage(E.Message);
end;
end;//<--disk dosyaları örneği
st:='Deneme'#13#10;
Mem.Write(st[1],8);Mem.Position:=0;//<--sıkıştırılacak Stream Mem isimli TMemoryStream'de, işlemden önce Position=0 ile kursörü başa almak önemli
ZipStream.AddFromStream('Deneme.txt',Mem);//<--Mem stream bilgisi ZipStream'e Deneme.txt olarak eklendi.
Mem.Clear;
st:='Akman'#13#10;
Mem.Write(st[1],7);Mem.Position:=0;//<--Başka bir mem bilgi oluştu
ZipStream.AddFromStream('Akman.txt',Mem);//<-Bu Mem bilgi de zip dosyasına eklendi...
TMemoryStream(ZipStream.FStream).SaveToFile(Edit3.Text{c:\yol\test.zip});{<--Sonuç olarak sıkıştırılmış .zip dosyası aslında dosyada değil, ZipStream.FStream özelliğindedir. Biz bu özelliği TMemoryStream'den oluşturduğumuz için o sınıfa çevirip dosyaya kayıt etmekteyiz
--->TMemoryStream(ZipStream.FStream) bilgisi illaki dosyaya kayıt edilmek zorunda değil, başka biçimlerle de kullanılabilir.}
finally
Mem.Free;
end;
sure:=GetTickCount-sure;
ShowMessage(Format('%d.%d Bitti',[sure div 1000,sure mod 1000]));
except
on E:Exception do begin
ShowMessage(E.Message);
end;
end;
ZipStream.FStream.Free;
ZipStream.Free;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .