標籤: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上傳和下載