C# 實(shí)現(xiàn)FTP客戶端的小例子
本文是利用C# 實(shí)現(xiàn)FTP客戶端的小例子,主要實(shí)現(xiàn)上傳,下載,刪除等功能,以供學(xué)習(xí)分享使用。
思路:
- 通過讀取FTP站點(diǎn)的目錄信息,列出對(duì)應(yīng)的文件及文件夾。
- 雙擊目錄,則顯示子目錄,如果是文件,則點(diǎn)擊右鍵,進(jìn)行下載和刪除操作。
- 通過讀取本地電腦的目錄,以樹狀結(jié)構(gòu)展示,選擇本地文件,右鍵進(jìn)行上傳操作。
涉及知識(shí)點(diǎn):
- FtpWebRequest【實(shí)現(xiàn)文件傳輸協(xié)議 (FTP) 客戶端】 / FtpWebResponse【封裝文件傳輸協(xié)議 (FTP) 服務(wù)器對(duì)請(qǐng)求的響應(yīng)】Ftp的操作主要集中在兩個(gè)類中。
- FlowLayoutPanel 【流布局面板】表示一個(gè)沿水平或垂直方向動(dòng)態(tài)排放其內(nèi)容的面板。
- ContextMenuStrip 【快捷菜單】 主要用于右鍵菜單。
- 資源文件:Resources 用于存放圖片及其他資源。
效果圖如下
左邊:雙擊文件夾進(jìn)入子目錄,點(diǎn)擊工具欄按鈕‘上級(jí)目錄'返回。文件點(diǎn)擊右鍵進(jìn)行操作。
右邊:文件夾則點(diǎn)擊前面+號(hào)展開。文件則點(diǎn)擊右鍵進(jìn)行上傳。
核心代碼如下
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FtpClient { public class FtpHelper { #region 屬性與構(gòu)造函數(shù) /// <summary> /// IP地址 /// </summary> public string IpAddr { get; set; } /// <summary> /// 相對(duì)路徑 /// </summary> public string RelatePath { get; set; } /// <summary> /// 端口號(hào) /// </summary> public string Port { get; set; } /// <summary> /// 用戶名 /// </summary> public string UserName { get; set; } /// <summary> /// 密碼 /// </summary> public string Password { get; set; } public FtpHelper() { } public FtpHelper(string ipAddr, string port, string userName, string password) { this.IpAddr = ipAddr; this.Port = port; this.UserName = userName; this.Password = password; } #endregion #region 方法 /// <summary> /// 下載文件 /// </summary> /// <param name="filePath"></param> /// <param name="isOk"></param> public void DownLoad(string filePath, out bool isOk) { string method = WebRequestMethods.Ftp.DownloadFile; var statusCode = FtpStatusCode.DataAlreadyOpen; FtpWebResponse response = callFtp(method); ReadByBytes(filePath, response, statusCode, out isOk); } public void UpLoad(string file,out bool isOk) { isOk = false; FileInfo fi = new FileInfo(file); FileStream fs = fi.OpenRead(); long length = fs.Length; string uri = string.Format("ftp://{0}:{1}{2}", this.IpAddr, this.Port, this.RelatePath); FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri); request.Credentials = new NetworkCredential(UserName, Password); request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = true; request.ContentLength = length; request.Timeout = 10 * 1000; try { Stream stream = request.GetRequestStream(); int BufferLength = 2048; //2K byte[] b = new byte[BufferLength]; int i; while ((i = fs.Read(b, 0, BufferLength)) > 0) { stream.Write(b, 0, i); } stream.Close(); stream.Dispose(); isOk = true; } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { if (request != null) { request.Abort(); request = null; } } } /// <summary> /// 刪除文件 /// </summary> /// <param name="isOk"></param> /// <returns></returns> public string[] DeleteFile(out bool isOk) { string method = WebRequestMethods.Ftp.DeleteFile; var statusCode = FtpStatusCode.FileActionOK; FtpWebResponse response = callFtp(method); return ReadByLine(response, statusCode, out isOk); } /// <summary> /// 展示目錄 /// </summary> public string[] ListDirectory(out bool isOk) { string method = WebRequestMethods.Ftp.ListDirectoryDetails; var statusCode = FtpStatusCode.DataAlreadyOpen; FtpWebResponse response= callFtp(method); return ReadByLine(response, statusCode, out isOk); } /// <summary> /// 設(shè)置上級(jí)目錄 /// </summary> public void SetPrePath() { string relatePath = this.RelatePath; if (string.IsNullOrEmpty(relatePath) || relatePath.LastIndexOf("/") == 0 ) { relatePath = ""; } else { relatePath = relatePath.Substring(0, relatePath.LastIndexOf("/")); } this.RelatePath = relatePath; } #endregion #region 私有方法 /// <summary> /// 調(diào)用Ftp,將命令發(fā)往Ftp并返回信息 /// </summary> /// <param name="method">要發(fā)往Ftp的命令</param> /// <returns></returns> private FtpWebResponse callFtp(string method) { string uri = string.Format("ftp://{0}:{1}{2}", this.IpAddr, this.Port, this.RelatePath); FtpWebRequest request; request = (FtpWebRequest)FtpWebRequest.Create(uri); request.UseBinary = true; request.UsePassive = true; request.Credentials = new NetworkCredential(UserName, Password); request.KeepAlive = false; request.Method = method; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); return response; } /// <summary> /// 按行讀取 /// </summary> /// <param name="response"></param> /// <param name="statusCode"></param> /// <param name="isOk"></param> /// <returns></returns> private string[] ReadByLine(FtpWebResponse response, FtpStatusCode statusCode,out bool isOk) { List<string> lstAccpet = new List<string>(); int i = 0; while (true) { if (response.StatusCode == statusCode) { using (StreamReader sr = new StreamReader(response.GetResponseStream())) { string line = sr.ReadLine(); while (!string.IsNullOrEmpty(line)) { lstAccpet.Add(line); line = sr.ReadLine(); } } isOk = true; break; } i++; if (i > 10) { isOk = false; break; } Thread.Sleep(200); } response.Close(); return lstAccpet.ToArray(); } private void ReadByBytes(string filePath,FtpWebResponse response, FtpStatusCode statusCode, out bool isOk) { isOk = false; int i = 0; while (true) { if (response.StatusCode == statusCode) { long length = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; using (FileStream outputStream = new FileStream(filePath, FileMode.Create)) { using (Stream ftpStream = response.GetResponseStream()) { readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } } } break; } i++; if (i > 10) { isOk = false; break; } Thread.Sleep(200); } response.Close(); } #endregion } /// <summary> /// Ftp內(nèi)容類型枚舉 /// </summary> public enum FtpContentType { undefined = 0, file = 1, folder = 2 } }
FTP服務(wù)端和客戶端示意圖
以上就是C# 實(shí)現(xiàn)FTP客戶端的小例子的詳細(xì)內(nèi)容,更多關(guān)于C# 實(shí)現(xiàn)FTP客戶端的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)在應(yīng)用程序間發(fā)送消息的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)在應(yīng)用程序間發(fā)送消息的方法,結(jié)合具體實(shí)例形式分析了C#實(shí)現(xiàn)項(xiàng)目之間信息發(fā)送、接收等交互操作相關(guān)技巧,需要的朋友可以參考下2017-06-06Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01C#結(jié)合AForge實(shí)現(xiàn)攝像頭錄像
最近由于興趣學(xué)習(xí)了下在C#上使用AForge錄制攝像頭視頻并壓縮編碼??傮w上來說這個(gè)第三方.net視覺開發(fā)庫還是比較穩(wěn)定的2017-09-09C# WebApi Get請(qǐng)求方式傳遞實(shí)體參數(shù)的方法示例
這篇文章主要給大家介紹了關(guān)于C# WebApi Get請(qǐng)求方式傳遞實(shí)體參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04