C# 實現FTP客戶端

来源:http://www.cnblogs.com/hsiang/archive/2017/07/27/7247801.html
-Advertisement-
Play Games

本文是利用C# 實現FTP客戶端的小例子,主要實現上傳,下載,刪除等功能,以供學習分享使用。 思路: 涉及知識點: 效果圖如下 左邊:雙擊文件夾進入子目錄,點擊工具欄按鈕‘上級目錄’返回。文件點擊右鍵進行操作。 右邊:文件夾則點擊前面+號展開。文件則點擊右鍵進行上傳。 核心代碼如下 1 using ...


本文是利用C# 實現FTP客戶端的小例子,主要實現上傳,下載,刪除等功能,以供學習分享使用。

思路:

  1. 通過讀取FTP站點的目錄信息,列出對應的文件及文件夾。
  2. 雙擊目錄,則顯示子目錄,如果是文件,則點擊右鍵,進行下載和刪除操作。
  3. 通過讀取本地電腦的目錄,以樹狀結構展示,選擇本地文件,右鍵進行上傳操作。

涉及知識點:

  1. FtpWebRequest【實現文件傳輸協議 (FTP) 客戶端】 / FtpWebResponse【封裝文件傳輸協議 (FTP) 伺服器對請求的響應】Ftp的操作主要集中在兩個類中。
  2. FlowLayoutPanel  【流佈局面板】表示一個沿水平或垂直方向動態排放其內容的面板。
  3. ContextMenuStrip 【快捷菜單】 主要用於右鍵菜單。
  4. 資源文件:Resources 用於存放圖片及其他資源。

效果圖如下

左邊:雙擊文件夾進入子目錄,點擊工具欄按鈕‘上級目錄’返回。文件點擊右鍵進行操作。

右邊:文件夾則點擊前面+號展開。文件則點擊右鍵進行上傳。

核心代碼如下

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Net;
  6 using System.Text;
  7 using System.Threading;
  8 using System.Threading.Tasks;
  9 
 10 namespace FtpClient
 11 {
 12     public class FtpHelper
 13     {
 14         #region 屬性與構造函數
 15 
 16         /// <summary>
 17         /// IP地址
 18         /// </summary>
 19         public string IpAddr { get; set; }
 20 
 21         /// <summary>
 22         /// 相對路徑
 23         /// </summary>
 24         public string RelatePath { get; set; }
 25 
 26         /// <summary>
 27         /// 埠號
 28         /// </summary>
 29         public string Port { get; set; }
 30 
 31         /// <summary>
 32         /// 用戶名
 33         /// </summary>
 34         public string UserName { get; set; }
 35 
 36         /// <summary>
 37         /// 密碼
 38         /// </summary>
 39         public string Password { get; set; }
 40 
 41        
 42 
 43         public FtpHelper() {
 44 
 45         }
 46 
 47         public FtpHelper(string ipAddr, string port, string userName, string password) {
 48             this.IpAddr = ipAddr;
 49             this.Port = port;
 50             this.UserName = userName;
 51             this.Password = password;
 52         }
 53 
 54         #endregion
 55 
 56         #region 方法
 57 
 58 
 59         /// <summary>
 60         /// 下載文件
 61         /// </summary>
 62         /// <param name="filePath"></param>
 63         /// <param name="isOk"></param>
 64         public void DownLoad(string filePath, out bool isOk) {
 65             string method = WebRequestMethods.Ftp.DownloadFile;
 66             var statusCode = FtpStatusCode.DataAlreadyOpen;
 67             FtpWebResponse response = callFtp(method);
 68             ReadByBytes(filePath, response, statusCode, out isOk);
 69         }
 70 
 71         public void UpLoad(string file,out bool isOk)
 72         {
 73             isOk = false;
 74             FileInfo fi = new FileInfo(file);
 75             FileStream fs = fi.OpenRead();
 76             long length = fs.Length;
 77             string uri = string.Format("ftp://{0}:{1}{2}", this.IpAddr, this.Port, this.RelatePath);
 78             FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
 79             request.Credentials = new NetworkCredential(UserName, Password);
 80             request.Method = WebRequestMethods.Ftp.UploadFile;
 81             request.UseBinary = true;
 82             request.ContentLength = length;
 83             request.Timeout = 10 * 1000;
 84             try
 85             {
 86                 Stream stream = request.GetRequestStream();
 87 
 88                 int BufferLength = 2048; //2K   
 89                 byte[] b = new byte[BufferLength];
 90                 int i;
 91                 while ((i = fs.Read(b, 0, BufferLength)) > 0)
 92                 {
 93                     stream.Write(b, 0, i);
 94                 }
 95                 stream.Close();
 96                 stream.Dispose();
 97                 isOk = true;
 98             }
 99             catch (Exception ex)
100             {
101                 Console.WriteLine(ex.ToString());
102             }
103             finally {
104                 if (request != null)
105                 {
106                     request.Abort();
107                     request = null;
108                 }
109             }
110         }
111 
112         /// <summary>
113         /// 刪除文件
114         /// </summary>
115         /// <param name="isOk"></param>
116         /// <returns></returns>
117         public string[] DeleteFile(out bool isOk) {
118             string method = WebRequestMethods.Ftp.DeleteFile;
119             var statusCode = FtpStatusCode.FileActionOK;
120             FtpWebResponse response = callFtp(method);
121             return ReadByLine(response, statusCode, out isOk);
122         }
123 
124         /// <summary>
125         /// 展示目錄
126         /// </summary>
127         public string[] ListDirectory(out bool isOk)
128         {
129             string method = WebRequestMethods.Ftp.ListDirectoryDetails;
130             var statusCode = FtpStatusCode.DataAlreadyOpen;
131             FtpWebResponse response= callFtp(method);
132             return ReadByLine(response, statusCode, out isOk);
133         }
134 
135         /// <summary>
136         /// 設置上級目錄
137         /// </summary>
138         public void SetPrePath()
139         {
140             string relatePath = this.RelatePath;
141             if (string.IsNullOrEmpty(relatePath) || relatePath.LastIndexOf("/") == 0 )
142             {
143                 relatePath = "";
144             }
145             else {
146                 relatePath = relatePath.Substring(0, relatePath.LastIndexOf("/"));
147             }
148             this.RelatePath = relatePath;
149         }
150 
151         #endregion
152 
153         #region 私有方法
154 
155         /// <summary>
156         /// 調用Ftp,將命令發往Ftp並返回信息
157         /// </summary>
158         /// <param name="method">要發往Ftp的命令</param>
159         /// <returns></returns>
160         private FtpWebResponse callFtp(string method)
161         {
162             string uri = string.Format("ftp://{0}:{1}{2}", this.IpAddr, this.Port, this.RelatePath);
163             FtpWebRequest request; request = (FtpWebRequest)FtpWebRequest.Create(uri);
164             request.UseBinary = true;
165             request.UsePassive = true;
166             request.Credentials = new NetworkCredential(UserName, Password);
167             request.KeepAlive = false;
168             request.Method = method;
169             FtpWebResponse response = (FtpWebResponse)request.GetResponse();
170             return response;
171         }
172 
173         /// <summary>
174         /// 按行讀取
175         /// </summary>
176         /// <param name="response"></param>
177         /// <param name="statusCode"></param>
178         /// <param name="isOk"></param>
179         /// <returns></returns>
180         private string[] ReadByLine(FtpWebResponse response, FtpStatusCode statusCode,out bool isOk) {
181             List<string> lstAccpet = new List<string>();
182             int i = 0;
183             while (true)
184             {
185                 if (response.StatusCode == statusCode)
186                 {
187                     using (StreamReader sr = new StreamReader(response.GetResponseStream()))
188                     {
189                         string line = sr.ReadLine();
190                         while (!string.IsNullOrEmpty(line))
191                         {
192                             lstAccpet.Add(line);
193                             line = sr.ReadLine();
194                         }
195                     }
196                     isOk = true;
197                     break;
198                 }
199                 i++;
200                 if (i > 10)
201                 {
202                     isOk = false;
203                     break;
204                 }
205                 Thread.Sleep(200);
206             }
207             response.Close();
208             return lstAccpet.ToArray();
209         }
210 
211         private void ReadByBytes(string filePath,FtpWebResponse response, FtpStatusCode statusCode, out bool isOk)
212         {
213             isOk = false;
214             int i = 0;
215             while (true)
216 
217             {
218                 if (response.StatusCode == statusCode)
219                 {
220                     long length = response.ContentLength;
221                     int bufferSize = 2048;
222                     int readCount;
223                     byte[] buffer = new byte[bufferSize];
224                     using (FileStream outputStream = new FileStream(filePath, FileMode.Create))
225                     {
226 
227                         using (Stream ftpStream = response.GetResponseStream())
228                         {
229                             readCount = ftpStream.Read(buffer, 0, bufferSize);
230                             while (readCount > 0)
231                             {
232                                 outputStream.Write(buffer, 0, readCount);
233                                 readCount = ftpStream.Read(buffer, 0, bufferSize);
234                             }
235                         }
236                     }
237                     break;
238                 }
239                 i++;
240                 if (i > 10)
241                 {
242                     isOk = false;
243                     break;
244                 }
245                 Thread.Sleep(200);
246             }
247             response.Close();
248         }
249         #endregion
250     }
251 
252     /// <summary>
253     /// Ftp內容類型枚舉
254     /// </summary>
255     public enum FtpContentType
256     {
257         undefined = 0,
258         file = 1,
259         folder = 2
260     }
261 }
View Code


源碼鏈接如下:

源碼下載

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vmstat——Virtual Memory Statistics(虛擬記憶體統計) 1. 作用 檢測系統資源變化,可以檢測CPU/記憶體/磁碟輸入輸出狀態等。 2. 用法 vmstat 【參數】【間隔秒數】【檢測次數】 參數: -a:使用inactive/active(活躍與否)替代buffer/ca ...
  • 操作系統:CentOS 7.3.1611 IP地址:192.168.21.130 網關:192.168.21.2 DNS:8.8.8.8 8.8.4.4 備註: CentOS 7.x系列只有64位系統,沒有32位。生產伺服器建議安裝CentOS-7-x86_64-Minimal-1611.iso版本 ...
  • 轉載自http://blog.csdn.net/ldl22847/article/details/76056501.下載jdk的rpm安裝包,這裡以jdk-7u4-linux-i586.rpm為例進行說明下載地址:http://www.oracle.com/technetwork/java/java ...
  • oghost@loghost-virtual-machine:~$ ~/home/loghost/qq$ sudo dpkg -i linuxqq_v1.0.2_beta1_i386.deb bash: /home/loghost/home/loghost/qq$: 沒有那個文件或目錄 //問題1出 ...
  • 經過google,出現這個問題的原因是,這是ssh的問題, GkFool大神說(第一次使用SSH連接時,會生成一個認證,儲存在客戶端的known_hosts中)我的解決辦法是: 1 ssh-keygen -R 伺服器端的ip地址View Code提示: 1 /用戶home目錄/.ssh/known_... ...
  • 回到占占推薦博客索引 本篇文章是對自己學習Linux及在它的環境下部署工具的一個總結,以方便自己查閱,也給他人一個幫助,本文章同時會不斷的更新,歡迎大家訂閱! 本目錄包括的內容會包括linux基礎命令,redis,mongodb,node.js,.net core,kafka,rabbitmq,zo ...
  • 背景:當option特別多時,一般的下拉框選擇起來就有點力不從心了,所以使用multiselect是個很好的選擇,可以通過輸入文字來選擇選項很方便,但是有一個需要下拉框聯動,網上找了半天才找到解決方法,在此分享一下 1、先引入 <script src="~/Assets/js/bootstrap-m ...
  • 最近剛開始做圖形操作,糾結了一上午,highchat 動態綁定數據這塊一直不知道怎麼綁定,後來多次嘗試,發現 1.x軸的數據是個數組格式,我從後臺傳到前臺的時候,js中用數組進行處理數據,然後賦值到chat就不會報錯, 2.y軸的數據和x軸數據還不一樣,通過數組處理後發現還是無法顯示。後來我在後臺將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...