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

FTP Sync Download Tree w/ Must-Match Constraints

See more FTP Examples

Demonstrates how synchronize a directory tree in the download direction, but only for files matching a set of wildcard filenames.

Note: This example requires Chilkat v9.5.0.76 or greater.

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.Ftp2,
  Chilkat.StringTable;

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

procedure RunDemo;
var
  success: Boolean;
  ftp: TFtp2;
  mode: Integer;
  st: TStringTable;
  numFiles: Integer;
  i: Integer;
  remoteFilename: string;

begin
  success := False;

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

  ftp := TFtp2.Create;

  ftp.Hostname := 'ftp.something.com';
  ftp.Username := 'my_login';
  ftp.Password := 'my_password';

  //  Connect and login to the FTP server.
  success := ftp.Connect();
  if (success <> True) then
    begin
      WriteLn(ftp.LastErrorText);
      Exit;
    end;

  //  Set the current remote directory to the root of
  //  the tree to be downloaded.
  success := ftp.ChangeRemoteDir('/subDir1');
  if (success <> True) then
    begin
      WriteLn(ftp.LastErrorText);
      Exit;
    end;

  //  Possible synchronization modes are:
  //  mode=0: Download all files
  //  mode=1: Download all files that do not exist on the local filesystem.
  //  mode=2: Download newer or non-existant files.
  //  mode=3: Download only newer files. If a file does not already exist on the local filesystem, it is not downloaded from the server..
  //  mode=5: Download only missing files or files with size differences.
  //  mode=6: Same as mode 5, but also download newer files.

  //  This example will download all files, but only those files having filenames
  //  that match *.gif and *.eml

  //  Imagine our remote directory tree has these files and directories:

  //  	accentedLatin1.txt
  //  	accentedUtf8.txt
  //  	alice.key
  //  	anter_cert.pem
  //  	chiliPepper.gif
  //  	helloWorld.pdf
  //  	abc/chiliPepper.gif
  //  	abc/ghk/
  //  	data/chiliPepper.gif
  //  	data/xyz/dkimHtmlBody.txt
  //  	data/xyz/dkimVerifyTest.eml
  //  	data/xyz/emailForCreateDsn.eml
  //  	text/frenchUtf8.txt
  //  	text/helloWorld.txt
  //  	text/PolishEmailBody.txt
  //  	text/something/

  //  Indicate that we only want to create auto-create local directories (if needed)
  //  for the files that are actually downloaded.  If SyncCreateAllLocalDirs remains
  //  True, then the corresponding local directory is created for each remote directory
  //  traversed regardless of whether files within are downloaded.
  ftp.SyncCreateAllLocalDirs := False;

  ftp.SyncMustMatch := '*.eml; *.gif';
  mode := 0;
  success := ftp.SyncLocalTree('c:/temp/subDir1',mode);
  if (success <> True) then
    begin
      WriteLn(ftp.LastErrorText);
      Exit;
    end;

  success := ftp.Disconnect();

  //  Show the files downloaded.
  st := TStringTable.Create;
  ftp.GetSyncedFiles(st);

  numFiles := st.Count;
  i := 0;

  while i < numFiles do
    begin
      WriteLn(st.StringAt(i));
      i := i + 1;
    end;

  //  Output showing the files downloaded:

  //  chiliPepper.gif
  //  abc/chiliPepper.gif
  //  data/chiliPepper.gif
  //  data/xyz/dkimVerifyTest.eml
  //  data/xyz/emailForCreateDsn.eml


  ftp.Free;
  st.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.