Değişken ZIP

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Değişken ZIP

Mesaj gönderen m_ekici »

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
varyemez
Üye
Mesajlar: 262
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Değişken ZIP

Mesaj gönderen varyemez »

Turbo power ın AbZipper komponentini kullanabilirsin. Stream içine alarak ziplyebilirsin
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Değişken ZIP

Mesaj gönderen m_ekici »

AbZipper demolarını inceledim, tamamında dosya ile işlem yapıyor. Kullanımını biliyorsan yazarmısın?
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Değişken ZIP

Mesaj gönderen esistem »

zlib paketi çok güzel yapıyor o işi, şöyle ki;

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;
kullanımı ;
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;
Açmak için ;

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;
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.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Değişken ZIP

Mesaj gönderen m_ekici »

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.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Değişken ZIP

Mesaj gönderen esistem »

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.
Kullanıcı avatarı
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

Mesaj gönderen sabanakman »

Vakti zamanında TAbZipArchive ile çalışmışlığım vardı. Öncelikle

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;
ş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ç

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. - .
Cevapla