Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Unzip Files Matching a Pattern (such as *.xml)

See more Zip Examples

Example code to unzip Files Matching a Pattern (such as *.xml)

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Zip,
  Chilkat.Http;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  zip: TZip;
  zipContentsXml: string;
  count: Integer;

begin
  success := False;

  //  This example works with the .zip located at http://www.example-code.com/data/test.zip

  //  This example assumes the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  First, let's download the .zip
  http := THttp.Create;
  success := http.Download('http://www.example-code.com/data/test.zip','qa_test/test.zip');
  if (success <> True) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  zip := TZip.Create;

  success := zip.OpenZip('qa_test/test.zip');
  if (success <> True) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;

  //  Show what's in the .zip by getting the directory as XML.
  zipContentsXml := zip.GetDirectoryAsXML();
  if (zip.LastMethodSuccess <> True) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;

  WriteLn(zipContentsXml);

  //  In this case, the contents of our .zip look like this:
  //  <?xml version="1.0" encoding="utf-8" ?>
  //  <zip_contents>
  //      <dir name="test">
  //          <dir name="abc">
  //              <dir name="123">
  //                  <file>ecc_public.pem</file>
  //                  <file>starfish.jpg</file>
  //              </dir>
  //              <file>comodo-certificates.pem</file>
  //              <file>pigs.xml</file>
  //          </dir>
  //          <file>COMODORSACertificationAuthority.crt</file>
  //          <file>hamlet.xml</file>
  //      </dir>
  //  </zip_contents>

  //  ------------------------------------------------------------------------
  //  If we wish to unzip only .xml files, use "*.xml" for the pattern\
  //  Unzip to the "qa_output" directory relative to our current working directory.
  //  (You may unzip to an absolute path by passing an absolute path, such as "/someDir" or
  //  "C:/someDir", etc.)
  //  This will unzip only the .xml files.  The relative directory structure within
  //  the .zip will be created in the local filesystem under the unzip directory
  //  path passed in the first argument, which in this case is "qa_output".
  count := zip.UnzipMatching('qa_output','*.xml',True);
  if (count < 0) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;
  WriteLn('unzipped ' + count + ' matching file(s).');

  //  ------------------------------------------------------------------------
  //  If we wish to unzip only files under the "123" directory, we can do this:
  count := zip.UnzipMatching('qa_output2','*/123/*',True);
  if (count < 0) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;
  WriteLn('unzipped ' + count + ' matching file(s).');

  //  ------------------------------------------------------------------------
  //  If no asterisk character is used, then the match must be exact.
  //  For example, to unzip "test/hamlet.xml" we must pass the exact path
  //  as it is in the .zip.  We cannot just pass "hamlet.xml".
  count := zip.UnzipMatching('qa_output3','test/hamlet.xml',True);
  if (count < 0) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;
  WriteLn('unzipped ' + count + ' matching file(s).');

  //  ------------------------------------------------------------------------
  //  If we want to unzip any file named "hamlet.xml" found in any sub-directory...
  count := zip.UnzipMatching('qa_output4','*/hamlet.xml',True);
  if (count < 0) then
    begin
      WriteLn(zip.LastErrorText);
      Exit;
    end;
  WriteLn('unzipped ' + count + ' matching file(s).');


  http.Free;
  zip.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.