C#从FTP服务器下载文件到本地

提供一个helper类,从FTP服务器下载文件到本地

public class FTPHelper
    {
        public static FtpFileInfo[] GetFtpFileInfos(string ftpPath, string userName, string passWord)
        {
            LinkedList<FtpFileInfo> linkedList = new LinkedList<FtpFileInfo>();
            var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
            reqFtp.UsePassive = false;
            reqFtp.UseBinary = true;
            reqFtp.Credentials = new NetworkCredential(userName, passWord);
            reqFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            var response = (FtpWebResponse)reqFtp.GetResponse();
            var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string fileDetail = reader.ReadLine();
            while (fileDetail != null)
            {
                linkedList.AddLast(new FtpFileInfo(fileDetail));
                fileDetail = reader.ReadLine();
            }
            reader.Close();
            response.Close();
            return linkedList.ToArray();
        }
        /// <summary>
        /// 从ftp下载文件夹到本地
        /// </summary>
        /// <param name="sourceDirectoryPath">源数据文件夹地址(备注:结尾不要“/”)</param>
        /// <param name="targetDirectoryPath">目标数据文件夹地址(备注:结尾不要“/”)</param>
        /// <param name="username">用户名</param>
        /// <param name="password">密码</param>
        public static bool DownLoadDirectory(string sourceDirectoryPath, string targetDirectoryPath, string username, string password)
        {
            try
            {
                var ftpFileInfos = GetFtpFileInfos(sourceDirectoryPath, username, password);
                if (ftpFileInfos != null && ftpFileInfos.Count() > 0)
                {
                    foreach (var file in ftpFileInfos)
                    {
                        string fullSourcePath = sourceDirectoryPath + "/" + file.FileName;
                        string fullTargetPath = targetDirectoryPath + "/" + file.FileName;
                        if (file.UnixFileType == "d")
                        {
                            if (!string.IsNullOrEmpty(file.FileName.Replace(".", "")))
                            {
                                DownLoadDirectory(fullSourcePath, fullTargetPath, username, password);
                            }
                        }
                        else
                        {
                            DownLoadFile(fullSourcePath, targetDirectoryPath, username, password);
                        }
                    }
                }
                return true;
            }catch
            {
                return false;
            }
            
        }
        /// <summary>
        /// 从ftp下载文件到本地文件夹
        /// </summary>
        /// <param name="fullSourcePath">ftp文件完整地址</param>
        /// <param name="targetDirectoryPath">目标文件夹路径</param>
        /// <param name="username">用户名</param>
        /// <param name="password">密码</param>
        public static void DownLoadFile(string fullSourcePath, string targetDirectoryPath, string username, string password)
        {
            Uri uri = new Uri(@fullSourcePath);
            string directory = System.IO.Path.GetFullPath(targetDirectoryPath);
            string filename = System.IO.Path.GetFileName(uri.LocalPath);
            string FileName = System.IO.Path.GetFullPath(directory) + System.IO.Path.DirectorySeparatorChar.ToString() + System.IO.Path.GetFileName(filename); //创建一个文件流            
            FileStream fs = null;
            Stream responseStream = null;
            try
            {
                //创建一个与FTP服务器联系的FtpWebRequest对象                
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
                //设置请求的方法是FTP文件下载                
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                //连接登录FTP服务器                
                request.Credentials = new NetworkCredential(username, password);
                //获取一个请求响应对象                
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                //获取请求的响应流                
                responseStream = response.GetResponseStream();
                //判断本地文件是否存在,如果存在,删除             
                if (File.Exists(FileName))
                {
                    File.Delete(FileName);
                }
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                fs = File.Create(FileName);
                if (fs != null)
                {
                    int buffer_count = 65536;
                    byte[] buffer = new byte[buffer_count];
                    int size = 0;
                    while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
                    {
                        fs.Write(buffer, 0, size);
                    }
                    fs.Flush();
                    fs.Close();
                    responseStream.Close();
                }
            }
            finally
            {
                if (fs != null)
                    fs.Close();
                if (responseStream != null)
                    responseStream.Close();
            }
        }
    }
    public class FTPHelper
    {
        public static FtpFileInfo[] GetFtpFileInfos(string ftpPath, string userName, string passWord)
        {
            LinkedList<FtpFileInfo> linkedList = new LinkedList<FtpFileInfo>();
            var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
            reqFtp.UsePassive = false;
            reqFtp.UseBinary = true;
            reqFtp.Credentials = new NetworkCredential(userName, passWord);
            reqFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            var response = (FtpWebResponse)reqFtp.GetResponse();
            var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string fileDetail = reader.ReadLine();
            while (fileDetail != null)
            {
                linkedList.AddLast(new FtpFileInfo(fileDetail));
                fileDetail = reader.ReadLine();
            }
            reader.Close();
            response.Close();
            return linkedList.ToArray();
        }
        /// <summary>
        /// 从ftp下载文件夹到本地
        /// </summary>
        /// <param name="sourceDirectoryPath">源数据文件夹地址(备注:结尾不要“/”)</param>
        /// <param name="targetDirectoryPath">目标数据文件夹地址(备注:结尾不要“/”)</param>
        /// <param name="username">用户名</param>
        /// <param name="password">密码</param>
        public static bool DownLoadDirectory(string sourceDirectoryPath, string targetDirectoryPath, string username, string password)
        {
            try
            {
                var ftpFileInfos = GetFtpFileInfos(sourceDirectoryPath, username, password);
                if (ftpFileInfos != null && ftpFileInfos.Count() > 0)
                {
                    foreach (var file in ftpFileInfos)
                    {
                        string fullSourcePath = sourceDirectoryPath + "/" + file.FileName;
                        string fullTargetPath = targetDirectoryPath + "/" + file.FileName;
                        if (file.UnixFileType == "d")
                        {
                            if (!string.IsNullOrEmpty(file.FileName.Replace(".", "")))
                            {
                                DownLoadDirectory(fullSourcePath, fullTargetPath, username, password);
                            }
                        }
                        else
                        {
                            DownLoadFile(fullSourcePath, targetDirectoryPath, username, password);
                        }
                    }
                }
                return true;
            }catch
            {
                return false;
            }
            
        }
        /// <summary>
        /// 从ftp下载文件到本地文件夹
        /// </summary>
        /// <param name="fullSourcePath">ftp文件完整地址</param>
        /// <param name="targetDirectoryPath">目标文件夹路径</param>
        /// <param name="username">用户名</param>
        /// <param name="password">密码</param>
        public static void DownLoadFile(string fullSourcePath, string targetDirectoryPath, string username, string password)
        {
            Uri uri = new Uri(@fullSourcePath);
            string directory = System.IO.Path.GetFullPath(targetDirectoryPath);
            string filename = System.IO.Path.GetFileName(uri.LocalPath);
            string FileName = System.IO.Path.GetFullPath(directory) + System.IO.Path.DirectorySeparatorChar.ToString() + System.IO.Path.GetFileName(filename); //创建一个文件流            
            FileStream fs = null;
            Stream responseStream = null;
            try
            {
                //创建一个与FTP服务器联系的FtpWebRequest对象                
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
                //设置请求的方法是FTP文件下载                
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                //连接登录FTP服务器                
                request.Credentials = new NetworkCredential(username, password);
                //获取一个请求响应对象                
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                //获取请求的响应流                
                responseStream = response.GetResponseStream();
                //判断本地文件是否存在,如果存在,删除             
                if (File.Exists(FileName))
                {
                    File.Delete(FileName);
                }
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                fs = File.Create(FileName);
                if (fs != null)
                {
                    int buffer_count = 65536;
                    byte[] buffer = new byte[buffer_count];
                    int size = 0;
                    while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
                    {
                        fs.Write(buffer, 0, size);
                    }
                    fs.Flush();
                    fs.Close();
                    responseStream.Close();
                }
            }
            finally
            {
                if (fs != null)
                    fs.Close();
                if (responseStream != null)
                    responseStream.Close();
            }
        }
    }
    public class FtpFileInfo
    {
        public string UnixFileType { get; set; }
        public string Permission { get; set; }
        public string NumberOfHardLinks { get; set; }
        public string Owner { get; set; }
        public string Group { get; set; }
        public string Size { get; set; }
        public string LastModifiedDate { get; set; }
        public string FileName { get; set; }
        public string FileDetail { get; set; }

        public FtpFileInfo(string fileDetail)
        {
            this.FileDetail = fileDetail;
            int counter = 1;
            string[] propertyBlocks = fileDetail.Split(' ');
            foreach (string propertyBlock in propertyBlocks)
            {
                switch (counter)
                {
                    case 1:
                        {
                            //unix file types & permissions
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                if (propertyBlock.Length == 10)
                                {
                                    UnixFileType = propertyBlock[0].ToString();
                                    Permission = propertyBlock.Substring(1);
                                }
                                counter++;
                            }
                        }
                        break;
                    case 2:
                        {
                            //number of hard links
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                NumberOfHardLinks = propertyBlock;
                                counter++;
                            }
                        }
                        break;
                    case 3:
                        {
                            //owner
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                Owner = propertyBlock;
                                counter++;
                            }
                        }
                        break;
                    case 4:
                        {
                            //group
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                Group = propertyBlock;
                                counter++;
                            }
                        }
                        break;
                    case 5:
                        {
                            //size
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                Size = propertyBlock;
                                counter++;
                            }
                        }
                        break;
                    case 6:
                    case 7:
                    case 8:
                        {
                            //last-modified date
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                continue;
                            }
                            else
                            {
                                LastModifiedDate += propertyBlock + " ";
                                counter++;
                            }
                        }
                        break;
                    case 9:
                        {
                            //file name
                            if (string.IsNullOrWhiteSpace(propertyBlock))
                            {
                                FileName += " ";
                            }
                            else
                            {
                                FileName += propertyBlock;
                            }
                        }
                        break;
                }
            }
            LastModifiedDate = LastModifiedDate.Trim();
            FileName = FileName.Trim();
        }
    }

版权声明:本文为qq_34739157原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。