C# 实现FTP下载文件
初学C# 需要用到FTP下载文件,在这里记录一下。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; using System.Threading; namespace FtpUtils { class FtpHelper { // 默认常量界说 private static readonly string rootPath = "http://www.mamicode.com/"; private static readonly int defaultReadWriteTimeout = 300000; private static readonly int defaultFtpPort = 21; #region 设置初始化参数 private string host = string.Empty; public string Host { get { return this.host ?? string.Empty; } } private string username = string.Empty; public string Username { get { return this.username; } } private string password = string.Empty; public string Password { get { return this.password; } } IWebProxy proxy = null; public IWebProxy Proxy { get { return this.proxy; } set { this.proxy = value; } } private int port = defaultFtpPort; public int Port { get { return port; } set { this.port = value; } } private bool enableSsl = false; public bool EnableSsl { get { return enableSsl; } } private bool usePassive = true; public bool UsePassive { get { return usePassive; } set { this.usePassive = value; } } private bool useBinary = true; public bool UserBinary { get { return useBinary; } set { this.useBinary = value; } } private string remotePath = rootPath; public string RemotePath { get { return remotePath; } set { string result = rootPath; if (!string.IsNullOrEmpty(value) && value != rootPath) { result = Path.Combine(Path.Combine(rootPath, value.TrimStart(‘/‘).TrimEnd(‘/‘)), "http://www.mamicode.com/"); // 进行路径的拼接 } this.remotePath = result; } } private int readWriteTimeout = defaultReadWriteTimeout; public int ReadWriteTimeout { get { return readWriteTimeout; } set { this.readWriteTimeout = value; } } #endregion #region 结构函数 public FtpHelper(string host,string username, string password) : this(host, username, password, defaultFtpPort, null, false, true, true, defaultReadWriteTimeout) { } /// <summary> /// 结构函数 /// </summary> /// <param>主机名</param> /// <param>用户名</param> /// <param>暗码</param> /// <param>端标语 默认21</param> /// <param>代办代理 默认没有</param> /// <param>是否使用ssl 默认不用</param> /// <param>使用二进制</param> /// <param>获取或设置客户端应用措施的数据传输过程的行为</param> /// <param>读写超不时间 默认5min</param> public FtpHelper(string host, string username, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive, int readWriteTimeout) { this.host = host.ToLower().StartsWith("ftp://") ? host : "ftp://" + host; this.username = username; this.password = password; this.port = port; this.proxy = proxy; this.enableSsl = enableSsl; this.useBinary = useBinary; this.usePassive = usePassive; this.readWriteTimeout = readWriteTimeout; } #endregion /// <summary> /// 拼接URL /// </summary> /// <param>主机名</param> /// <param>地点</param> /// <param>文件名</param> /// <returns>返回完整的URL</returns> private string UrlCombine(string host, string remotePath, string fileName) { string result = new Uri(new Uri(new Uri(host.TrimEnd(‘/‘)), remotePath), fileName).ToString(); ; return result; } /// <summary> /// 创建连接 /// </summary> /// <param>地点</param> /// <param>要领</param> /// <returns>返回 request东西</returns> private FtpWebRequest CreateConnection(string url, string method) { FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); request.Credentials = new NetworkCredential(this.username, this.password); request.Proxy = this.proxy; request.KeepAlive = false; request.UseBinary = useBinary; request.UsePassive = usePassive; request.EnableSsl = enableSsl; request.Method = method; Console.WriteLine(request); return request; } /// <summary> /// 上传文件 /// </summary> /// <param>本地文件</param> /// <param>上传文件名</param> /// <returns>上传告成返回 true</returns> public bool Upload(FileInfo localFile, string remoteFileName) { bool result = false; if (localFile.Exists) { try { string url = UrlCombine(Host, RemotePath, remoteFileName); FtpWebRequest request = CreateConnection(url, WebRequestMethods.Ftp.UploadFile); using (Stream rs = request.GetRequestStream()) using (FileStream fs = localFile.OpenRead()) { byte[] buffer = new byte[1024 * 4]; int count = fs.Read(buffer, 0, buffer.Length); while (count > 0) { rs.Write(buffer, 0, count); count = fs.Read(buffer, 0, buffer.Length); } fs.Close(); result = true; } } catch (WebException ex) { MessageBox.Show(ex.Message); } return result; } // 措置惩罚惩罚本地文件不存在的情况 return false; } /// <summary> /// 下载文件 /// </summary> /// <param>处事器文件名称</param> /// <param>需要生存在本地的文件名称</param> /// <returns>下载告成返回 true</returns> public bool Download(string serverName, string localName) { bool result = false; using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate)) { try { string url = UrlCombine(Host, RemotePath, serverName); Console.WriteLine(url); FtpWebRequest request = CreateConnection(url, WebRequestMethods.Ftp.DownloadFile); request.ContentOffset = fs.Length; using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { fs.Position = fs.Length; byte[] buffer = new byte[1024 * 4]; 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; } catch (WebException ex) { // 措置惩罚惩罚ftp连接中的异常 } } return result; } } }具体FtpWebRequest检察文档:
https://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive(v=vs.110).aspx