C# 實現FTP上傳和下載

來源:互聯網
上載者:User

標籤:result   .sh   ssi   ring   method   enables   sts   ftp下載   應用   

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 = "/";        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(‘/‘)), "/"); // 進行路徑的拼接                }                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 name="host">主機名稱</param>        /// <param name="username">使用者名稱</param>        /// <param name="password">密碼</param>        /// <param name="port">連接埠號碼 預設21</param>        /// <param name="proxy">代理 預設沒有</param>        /// <param name="enableSsl">是否使用ssl 預設不用</param>        /// <param name="useBinary">使用二進位</param>        /// <param name="usePassive">擷取或設定用戶端應用程式的資料轉送過程的行為</param>        /// <param name="readWriteTimeout">讀寫逾時時間 預設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 name="host">主機名稱</param>        /// <param name="remotePath">地址</param>        /// <param name="fileName">檔案名稱</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 name="url">地址</param>        /// <param name="method">方法</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 name="localFile">本地檔案</param>        /// <param name="remoteFileName">上傳檔案名稱</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 name="serverName">伺服器檔案名稱</param>        /// <param name="localName">需要儲存在本地的檔案名稱</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

C# 實現FTP上傳和下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.