private void DownloadFilesAsync(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            AsyncDataStruct ads = (AsyncDataStruct)e.Argument;

            System.ComponentModel.BackgroundWorker worker = sender as System.ComponentModel.BackgroundWorker;
            //
            FTPLib.FtpClient ftp = FTP;
            int perc, old_perc = 0;

            //
            foreach (string remotePath in ads.FileList)
            {
                if (worker.CancellationPending)
                {
                    break;
                }
                // open the file on the server and localy
                string remoteFilePath = System.IO.Path.GetDirectoryName(remotePath);
                string remoteFileName = System.IO.Path.GetFileName(remotePath);
                //
                ftp.ChangeDir(remoteFilePath);
                ftp.OpenDownload(remotePath, System.IO.Path.Combine(ads.Directory.FullName, remoteFileName), false);

                // download the file (read it from server, write it to disk)
                while (true)
                {
                    perc = ftp.DoDownload();

                    // No need to report progress everytime we get some bytes
                    // because it causes a flickery effect on the screen in most cases.
                    if (perc > old_perc)
                    {
                        worker.ReportProgress(perc, remoteFileName);
                    }

                    // is the download done?
                    if (perc == 100)
                    {
                        break;
                    }

                    old_perc = perc;
                }
            }
        }
        public void DownloadFiles(System.Collections.Specialized.StringCollection fileList, System.IO.DirectoryInfo directoryInfo, System.ComponentModel.ProgressChangedEventHandler progressChangedEventHandler, System.ComponentModel.RunWorkerCompletedEventHandler runWorkerCompletedEventHandler)
        {
            System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
            if (progressChangedEventHandler != null)
            {
                worker.ProgressChanged           += progressChangedEventHandler;
                worker.WorkerReportsProgress      = true;
                worker.WorkerSupportsCancellation = true;
            }
            if (runWorkerCompletedEventHandler != null)
            {
                worker.RunWorkerCompleted += runWorkerCompletedEventHandler;
            }
            worker.DoWork += new System.ComponentModel.DoWorkEventHandler(DownloadFilesAsync);
            AsyncDataStruct ads = new AsyncDataStruct();

            ads.Directory = directoryInfo;
            ads.FileList  = fileList;
            worker.RunWorkerAsync(ads);
        }
 public void DownloadFiles(System.Collections.Specialized.StringCollection fileList, System.IO.DirectoryInfo directoryInfo, System.ComponentModel.ProgressChangedEventHandler progressChangedEventHandler, System.ComponentModel.RunWorkerCompletedEventHandler runWorkerCompletedEventHandler)
 {
     System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
     if(progressChangedEventHandler!=null)
     {
         worker.ProgressChanged += progressChangedEventHandler;
         worker.WorkerReportsProgress = true;
         worker.WorkerSupportsCancellation = true;
     }
     if(runWorkerCompletedEventHandler!=null)
     {
         worker.RunWorkerCompleted += runWorkerCompletedEventHandler;
     }
     worker.DoWork += new System.ComponentModel.DoWorkEventHandler(DownloadFilesAsync);
     AsyncDataStruct ads = new AsyncDataStruct();
     ads.Directory = directoryInfo;
     ads.FileList = fileList;
     worker.RunWorkerAsync(ads);
 }