C# 實現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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM