/// <summary>
        /// Internal helper methods to create nodes and assign them as root or child nodes.
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="parentNode"></param>
        /// <param name="parentCollection"></param>
        private void RequestHelper(TreeViewFolderBrowserNodeFactory helper, TreeNodePath parentNode, System.Windows.Forms.TreeNodeCollection parentCollection)
        {
            FTPLib.FtpClient ftp = FTP;

            if (parentNode != null)
            {
                ftp.ChangeDir(parentNode.Path);
            }
            else
            {
                ftp.ChangeDir(_directorySeparatorChar);
            }
            //
            foreach (FTPLib.ServerFileData serverData in ftp.List())
            {
                // skip files if there should not be filled in
                if (!serverData.isDirectory && !ShowFiles)
                {
                    continue;
                }
                //
                CreateTreeNode(parentNode,
                               serverData.fileName, parentNode != null ? parentNode.Path + "/" + serverData.fileName : _directorySeparatorChar + serverData.fileName,
                               !serverData.isDirectory,
                               serverData.isDirectory,
                               false);
            }
            //
            return;
        }
 /// <summary>
 /// Releases a existing ftp component (disconnect) instance
 /// </summary>
 private void ResetFtp()
 {
     if (_ftp != null)
     {
         _ftp.Disconnect();
     }
     _ftp = null;
 }
        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;
                }
            }
        }
 /// <summary>
 /// Releases a existing ftp component (disconnect) instance
 /// </summary>
 private void ResetFtp()
 {
     if(_ftp!=null)
     {
         _ftp.Disconnect();
     }
     _ftp = null;
 }