C++ Builder Snippets  


Dateien komprimieren, ZIP-Dateien erzeugen:
 
Es gibt viele Komponenten für Delphi und C++ Builder, mit deren Hilfe ZIP-Dateien erzeugt bzw. entpackt werden können. Die meisten davon verwenden kostenlose platformunabhängige Bibliothek ZLIB von Jean-loup Gailly und Mark Adler.

Folgendes Beispiel zeigt, wie die ZLIB (Ver. 1.2.3) in eine "stand alone" C++ Builder-Anwendung ohne zusätzliche DLLs integriert werden kann.


Screenshot des Beispielprojekts

Komprimierung sowie das Enpacken von Dateien erfolgt über eine kleine "Wrapper-Klasse" TZipObj, die die eigentlichen Aufrufe der ZLIB-Bibliothek kapselt. Zusätzlich stellt TZipObj Events zu Implementierung der Fortschrittsanzeige und zur Ausgabe von Statusmeldungen zur Verfügung.

Um die TZipObj-Klasse in Ihre Projekte zu transferieren, kopieren Sie die Dateien TZipObj.h und TZipObj.cpp aus dem Root-Verzeichnis des Beispielprojekts, sowie das Unterverzeichnis \ZLIB mit Bibliotheksquellcode in Ihr Projektverzeichnis und fügen Sie die TZipObj.cpp, sowie alle *.C Dateien des ZLIB-Verzeichnisses über den BCB-Menüpunkt "Projekt -> Dem Projekt hinzufügen..." Ihrem Projekt hinzu.

Anwendungsbeispiel (Erzeugen von ZIP-Dateien):
TZipObj* pZip = new TZipObj;
TStringList* pFiles = new TStringList;
if(pZip != NULL && pFiles != NULL )
{
  pFiles->Add("c:\\test.txt");
  pFiles->Add("f:\\abc.exe");
  pFiles->Add("d:\\archiv\\123.dll");
  pZip->CompressFiles(pFiles ,"c:\\output.zip",7, false);
  delete pFiles;
  delete pZip;
}

Anwendungsbeispiel (Entpacken von ZIP-Dateien):
TZipObj* pZip = new TZipObj;
if(pZip != NULL)
{
  // assign status eventhandler
  pZip->OnZipStatus = ZipStatus;
  // assign total progress eventhandler
  pZip->OnZipProgress = ZipProgress;
  // assign current file progress eventhandler
  pZip->OnZipFileProgress = ZipFileProgress;

  // extract defined file(s):
  pZip->UncompressFile(
    sgZipFile,                       // source zip archive file
    psllFiles->Text,                 // file(s) to extract (separated
                                      // by CRLF if more than one)
    editOutputDir->Text,             // target directory
    true,                            // Flag 'Extract!'
    chkOverwrite->Checked,           // flag "overwrite existing files"
    chkExtractWithoutPath->Checked,  // "extract without path" flag
    lvArchiveContent);               // Pointer to ListView with archive info

  delete pZip;
}
Für die Implementierung der Fortschritts- und Statusanzeigen, müssen die entsprechenden Ereignisbehandlungsroutinen erstellt, in der Header- Datei des Formulars deklariert und der TZipObj-Instanz vor dem Aufruf von CompressFiles() bzw. UncompressFiles() zugewiesen werden:
//---------------------------------------------------------------------------
// Eventhandler für das OnZipProgress-Ereignis
//---------------------------------------------------------------------------
void __fastcall TForm1::ZipProgress(TObject* Sender, int Percent)
{
  ProgressBar1->Position = Percent;
  LabelArchiveProgress->Caption = IntToStr(Percent) + " %";
}

//---------------------------------------------------------------------------
// Eventhandler für das OnZipFileProgress-Ereignis
//---------------------------------------------------------------------------
void __fastcall TForm1::ZipFileProgress(TObject* Sender, int Percent)
{
  ProgressBar2->Position = Percent;
  LabelFileProgress->Caption = IntToStr(Percent) + " %";
  Application->ProcessMessages();
}

//---------------------------------------------------------------------------
// Eventhandler für das OnZipStatus-Ereignis
//---------------------------------------------------------------------------
void __fastcall TForm1::ZipStatus(TObject* Sender,
  AnsiString slMessage, int ilStatusId)
{
  Memo1->Lines->Add(slMessage);
  StatusBar1->SimpleText = slMessage;
}


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2005 by S. Kreutzmann