public List <FtpDirectoryEntry> ListDirectory(string dir, bool recursive = false)
        {
            var retVal = new List <FtpDirectoryEntry>();

            var request = GetNewRequest(Hostname.Concat(dir), WebRequestMethods.Ftp.ListDirectoryDetails);

            using (var response = request.GetResponse())
            {
                using (var stream = new StreamReader(response.GetResponseStream()))
                {
                    while (!stream.EndOfStream)
                    {
                        var line  = stream.ReadLine();
                        var entry = FtpDirectoryEntry.Parse(dir, line);
                        retVal.Add(entry);
                    }
                }
            }

            if (recursive)
            {
                var add = new List <FtpDirectoryEntry>();
                foreach (var d in retVal.Where(e => e.IsDirectory))
                {
                    var list = ListDirectory(d.Name, recursive);
                    add.AddRange(list);
                }
                retVal.AddRange(add);
            }

            return(retVal);
        }
        public bool UploadDirectory(string directory, string destination)
        {
            if (directory[directory.Length - 1] != Path.DirectorySeparatorChar)
            {
                directory += Path.DirectorySeparatorChar;
            }

            var fileList = FileList.Build(new Configuration.SourceDirectory()
            {
                Directory = directory
            });
            var logger = Logger.Global;

            Parallel.ForEach(fileList.Files,
                             new ParallelOptions()
            {
                MaxDegreeOfParallelism = Threads
            },
                             f =>
            {
                var relPath    = directory.RelativePath(f.Path).Replace('\\', '/');
                var relPathDir = directory.RelativePath(Path.GetDirectoryName(f.Path)).Replace('\\', '/');

                CreateDirectory(FtpDirectoryEntry.Combine(destination, relPathDir), true);

                logger.Write($"Uploading file {relPath}.");
                UploadFile(f.Path, FtpDirectoryEntry.Combine(destination, relPath));
            });

            return(false);
        }