C#编程之C#实现ftp上传和下载
小标 2018-11-14 来源 : 阅读 1691 评论 0

摘要:本文主要向大家介绍了C#编程之C#实现ftp上传和下载,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C#实现ftp上传和下载,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。


调整内容为三部分:Web.config配置,帮助类,实现调用第一步:Web.config配置如下:

第二步:帮助类FtpHelper如下:

public class FtpHelper
    {
        public static string _host = ConfigurationManager.AppSettings["FtpUrl"];
        public static string _userId = ConfigurationManager.AppSettings["FtpUserID"];
        public static string _password = ConfigurationManager.AppSettings["FtpPwd"];
        public static string _remotePath = ConfigurationManager.AppSettings["FtpRemotePath"];

        #region 构造函数
        /// 


        /// 创建FTP工具
        /// 
        /// 默认不使用SSL,使用二进制传输方式,使用被动模式FTP有两种使用模式:主动和被动。
        /// 主动模式要求客户端和服务器端同时打开并且监听一个端口以建立连接。
        /// 在这种情况下,客户端由于安装了防火墙会产生一些问题。
        /// 所以,创立了被动模式。
        /// 被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。
        /// 

        /// 


        /// 

主机名称
        /// 

用户名
        /// 

密码
        public FtpHelper()
             : this(_host, _userId, _password, 21, null, false, true, true)
        {
        }

        /// 


        /// 创建FTP工具
        /// 


        /// 

主机名称
        /// 

用户名
        /// 

密码
        /// 

端口
        /// 

允许Ssl
        /// 

代理
        /// 

允许二进制
        /// 

允许被动模式
        public FtpHelper(string host, string userId, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive)
        {
            this.userId = userId;
            this.password = password;
            if (host.ToLower().StartsWith("ftp://"))
            {
                this.host = host;
            }
            else
            {
                this.host = "ftp://" + host;
            }
            this.port = port;
            this.proxy = proxy;
            this.enableSsl = enableSsl;
            this.useBinary = useBinary;
            this.usePassive = usePassive;
        }
        #endregion

        #region 变量
        #region 主机
        private string host = string.Empty;
        /// 


        /// 主机
        /// 


        public string Host
        {
            get
            {
                return this.host ?? string.Empty;//如果左操作数为空则返回右操作数,不为空返回左操作数
            }
        }
        #endregion

        #region 登录用户名
        private string userId = string.Empty;
        /// 


        /// 登录用户名
        /// 


        public string UserId
        {
            get
            {
                return this.userId;
            }
        }
        #endregion

        #region 密码
        private string password = string.Empty;
        /// 


        /// 密码
        /// 


        public string Password
        {
            get
            {
                return this.password;
            }
        }
        #endregion

        #region 代理
        IWebProxy proxy = null;
        /// 


        /// 代理
        /// 


        public IWebProxy Proxy
        {
            get
            {
                return this.proxy;
            }
            set
            {
                this.proxy = value;
            }
        }
        #endregion

        #region 端口
        private int port = 21;
        /// 


        /// 端口
        /// 


        public int Port
        {
            get
            {
                return port;
            }
            set
            {
                this.port = value;
            }
        }
        #endregion

        #region 设置是否允许Ssl
        private bool enableSsl = false;
        /// 


        /// EnableSsl 
        /// 


        public bool EnableSsl
        {
            get
            {
                return enableSsl;
            }
        }
        #endregion

        #region 使用被动模式
        private bool usePassive = true;
        /// 


        /// 被动模式
        /// 


        public bool UsePassive
        {
            get
            {
                return usePassive;
            }
            set
            {
                this.usePassive = value;
            }
        }
        #endregion

        #region 二进制方式
        private bool useBinary = true;
        /// 


        /// 二进制方式
        /// 


        public bool UseBinary
        {
            get
            {
                return useBinary;
            }
            set
            {
                this.useBinary = value;
            }
        }
        #endregion

        #region 远端路径
        private string remotePath = "/" + _remotePath + "/";
        /// 


        /// 远端路径
        /// 
        /// 返回FTP服务器上的当前路径(可以是 / 或 /a/../ 的形式)
        /// 

        /// 


        public string RemotePath
        {
            get
            {
                return remotePath;
            }
            set
            {
                string result = "/";
                if (!string.IsNullOrEmpty(value) && value != "/")
                {
                    result = "/" + value.TrimStart(‘/‘).TrimEnd(‘/‘) + "/";
                }
                this.remotePath = result;
            }
        }
        #endregion

        #endregion

        #region 创建一个FTP连接
        /// 


        /// 创建一个FTP请求
        /// 


        /// 

请求地址
        /// 

请求方法
        /// 

FTP请求


        private FtpWebRequest CreateRequest(string url, string method)
        {
            //建立连接
            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
            request.Credentials = new NetworkCredential(this.userId, this.password);
            request.Proxy = this.proxy;
            request.KeepAlive = false;//命令执行完毕之后关闭连接
            request.UseBinary = useBinary;
            request.UsePassive = usePassive;
            request.EnableSsl = enableSsl;
            request.Method = method;
            return request;

        }
        #endregion

        #region 上传一个文件到远端路径下
        /// 


        /// 把文件上传到FTP服务器的RemotePath下
        /// 


        /// 

本地文件信息
        /// 

要保存到FTP文件服务器上的文件名称包含扩展名
        public bool Upload(FileInfo localFile, string remoteFileName)
        {
            bool result = false;
            if (localFile.Exists)
            {
                string url = Host.TrimEnd(‘/‘) + RemotePath + remoteFileName;

                FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.UploadFile);

                //上传数据
                using (Stream rs = request.GetRequestStream())
                using (FileStream fs = localFile.OpenRead())
                {
                    byte[] buffer = new byte[4096];//4K
                    int count = fs.Read(buffer, 0, buffer.Length);//每次从流中读4个字节再写入缓冲区
                    while (count > 0)
                    {
                        rs.Write(buffer, 0, count);
                        count = fs.Read(buffer, 0, buffer.Length);
                    }
                    fs.Close();
                    result = true;
                }
                return result;
            }
            throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
        }
        #endregion

        #region 从FTP服务器上下载文件
        /// 


        /// 从当前目录下下载文件
        /// 
        /// 如果本地文件存在,则从本地文件结束的位置开始下载.
        /// 

        /// 


        /// 

服务器上的文件名称
        /// 

本地文件名称
        /// 

返回一个值,指示是否下载成功


        public bool Download(string serverName, string localName)
        {
            bool result = false;
            using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate)) //创建或打开本地文件
            {
                //建立连接
                string url = Host.TrimEnd(‘/‘) + RemotePath + serverName;
                FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DownloadFile);
                request.ContentOffset = fs.Length;
                using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
                {
                    fs.Position = fs.Length;
                    byte[] buffer = new byte[4096];//4K
                    int count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
                    while (count > 0)
                    {
                        fs.Write(buffer, 0, count);
                        count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
                    }
                    response.GetResponseStream().Close();
                }
                result = true;
            }
            return result;
        }
        #endregion

        #region 重命名FTP服务器上的文件
        /// 


        /// 文件更名
        /// 


        /// 

原文件名
        /// 

新文件名
        /// 

返回一个值,指示更名是否成功


        public bool Rename(string oldFileName, string newFileName)
        {
            bool result = false;
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath + oldFileName;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.Rename);
            request.RenameTo = newFileName;
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                result = true;
            }
            return result;
        }
        #endregion

        #region 从当前目录下获取文件列表
        /// 


        /// 获取当前目录下文件列表
        /// 


        /// 


        public List

 GetFileList()
        {
            List result = new List();
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectory);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Add(line);
                    line = reader.ReadLine();
                }
            }
            return result;
        }
        #endregion

        #region 从FTP服务器上获取文件和文件夹列表
        /// 
        /// 获取详细列表
        /// 

        /// 
        public List GetFileDetails()
        {
            List result = new List();
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Add(line);
                    line = reader.ReadLine();
                }
            }
            return result;
        }
        #endregion

        #region 从FTP服务器上删除文件
        /// 
        /// 删除FTP服务器上的文件
        /// 

        /// 文件名称
        /// 返回一个值,指示是否删除成功
        public bool DeleteFile(string fileName)
        {
            bool result = false;
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath + fileName;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DeleteFile);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                result = true;
            }

            return result;
        }
        #endregion

        #region 在FTP服务器上创建目录
        /// 
        /// 在当前目录下创建文件夹
        /// 

        /// 文件夹名称
        /// 返回一个值,指示是否创建成功
        public bool MakeDirectory(string dirName)
        {
            bool result = false;
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath + dirName;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.MakeDirectory);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                result = true;
            }
            return result;
        }
        #endregion

        #region 从FTP服务器上删除目录
        /// 
        /// 删除文件夹
        /// 

        /// 文件夹名称
        /// 返回一个值,指示是否删除成功
        public bool DeleteDirectory(string dirName)
        {
            bool result = false;
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath + dirName;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.RemoveDirectory);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                result = true;
            }
            return result;
        }
        #endregion

        #region 从FTP服务器上获取文件大小
        /// 
        /// 获取文件大小
        /// 

        /// 
        /// 
        public long GetFileSize(string fileName)
        {
            long result = 0;
            //建立连接
            string url = Host.TrimEnd(‘/‘) + RemotePath + fileName;
            FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.GetFileSize);
            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                result = response.ContentLength;
            }

            return result;
        }
        #endregion

        #region 给FTP服务器上的文件追加内容
        /// 
        /// 给FTP服务器上的文件追加内容
        /// 

        /// 本地文件
        /// FTP服务器上的文件
        /// 返回一个值,指示是否追加成功
        public bool Append(FileInfo localFile, string remoteFileName)
        {
            if (localFile.Exists)
            {
                using (FileStream fs = new FileStream(localFile.FullName, FileMode.Open))
                {
                    return Append(fs, remoteFileName);
                }
            }
            throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
        }

        /// 
        /// 给FTP服务器上的文件追加内容
        /// 

        /// 数据流(可通过设置偏移来实现从特定位置开始上传)
        /// FTP服务器上的文件
        /// 返回一个值,指示是否追加成功
        public bool Append(Stream stream, string remoteFileName)
        {
            bool result = false;
            if (stream != null && stream.CanRead)
            {
                //建立连接
                string url = Host.TrimEnd(‘/‘) + RemotePath + remoteFileName;
                FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.AppendFile);
                using (Stream rs = request.GetRequestStream())
                {
                    //上传数据
                    byte[] buffer = new byte[4096];//4K
                    int count = stream.Read(buffer, 0, buffer.Length);
                    while (count > 0)
                    {
                        rs.Write(buffer, 0, count);
                        count = stream.Read(buffer, 0, buffer.Length);
                    }
                    result = true;
                }
            }
            return result;
        }
        #endregion

        #region 获取FTP服务器上的当前路径
        /// 
        /// 获取FTP服务器上的当前路径
        /// 

        public string CurrentDirectory
        {
            get
            {
                string result = string.Empty;
                string url = Host.TrimEnd(‘/‘) + RemotePath;
                FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.PrintWorkingDirectory);
                using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
                {
                    string temp = response.StatusDescription;
                    int start = temp.IndexOf(‘"‘) + 1;
                    int end = temp.LastIndexOf(‘"‘);
                    if (end >= start)
                    {
                        result = temp.Substring(start, end - start);
                    }
                }
                return result;

            }
        }
        #endregion

        #region 检查当前路径上是否存在某个文件
        /// 
        /// 检查文件是否存在
        /// 

        /// 要检查的文件名
        /// 返回一个值,指示要检查的文件是否存在
        public bool CheckFileExist(string fileName)
        {
            bool result = false;
            if (fileName != null && fileName.Trim().Length > 0)
            {
                fileName = fileName.Trim();
                List files = GetFileList();
                if (files != null && files.Count > 0)
                {
                    foreach (string file in files)
                    {
                        if (file.ToLower() == fileName.ToLower())
                        {
                            result = true;
                            break;
                        }
                    }
                }
            }
            return result;
        }
        #endregion

    }

 
第三步:调用处理如下:

            FtpHelper f = new FtpHelper();
            FileInfo fi = new FileInfo(@"F:\TestFile\00000001.txt");
                        //上传00000001.txt 到ftp服务器文件命名为00000001——test.txt
            f.Upload(fi, "00000001——test.txt");
                        //下载ftp服务器中文件test.txt到本地F:\TestFile\aaa.txt
            //f.Download("test.txt", @"F:\TestFile\aaa.txt");

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程