最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)FTP客戶端的案例

 更新時間:2017年07月28日 09:07:27   作者:飛翔的月亮  
這篇文章主要為大家詳細介紹了C#實現(xiàn)FTP客戶端的小案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

思路:

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

涉及知識點:

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

效果圖如下

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

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

核心代碼如下

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 屬性與構造函數(shù)

    /// <summary>
    /// IP地址
    /// </summary>
    public string IpAddr { get; set; }

    /// <summary>
    /// 相對路徑
    /// </summary>
    public string RelatePath { get; set; }

    /// <summary>
    /// 端口號
    /// </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>
    /// 設置上級目錄
    /// </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>
    /// 調用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
  }
}

源碼鏈接如下:案例

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 深入理解C# 委托與事件

    深入理解C# 委托與事件

    本文主要介紹了深入理解C# 委托與事件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2008-05-05
  • C#8.0中的模式匹配

    C#8.0中的模式匹配

    這篇文章介紹了C#8.0中的模式匹配,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#實現(xiàn)過濾sql特殊字符的方法集合

    C#實現(xiàn)過濾sql特殊字符的方法集合

    這篇文章主要介紹了C#實現(xiàn)過濾sql特殊字符的方法,以實例形式分析總結了C#針對SQL危險字符的幾種常用的過濾技巧,非常具有實用價值,需要的朋友可以參考下
    2015-11-11
  • C#代碼實現(xiàn)短信驗證碼接口示例

    C#代碼實現(xiàn)短信驗證碼接口示例

    這篇文章主要為大家詳細介紹了C#實現(xiàn)短信驗證碼接口示例代碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C#中Invoke的用法講解

    C#中Invoke的用法講解

    這篇文章主要介紹了C#中Invoke的用法講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C#調用Polly庫實現(xiàn)捕捉異常處理的操作代碼

    C#調用Polly庫實現(xiàn)捕捉異常處理的操作代碼

    Polly 是一個 .NET 彈性和瞬態(tài)故障處理庫,允許開發(fā)人員以 Fluent 和線程安全的方式來實現(xiàn)重試、斷路、超時、隔離和回退策略,本文給大家介紹了C#調用Polly庫實現(xiàn)捕捉異常處理操作,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C#實現(xiàn)回文檢測的方法

    C#實現(xiàn)回文檢測的方法

    這篇文章主要介紹了C#實現(xiàn)回文檢測的方法,實例分析了C#使用棧進行回文檢測的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 獲得.net控件的windows句柄的方法

    獲得.net控件的windows句柄的方法

    有一個簡單的獲得控件的句柄的竅門。你將窗體設置為鼠標可捕獲,那么你的窗口句柄可以通過使用Windows API捕獲。 這個想法在以下的GetHWnd函數(shù)中實現(xiàn):
    2013-04-04
  • C#常用排序方式總結

    C#常用排序方式總結

    在最近的項目中經(jīng)常會對C#中的數(shù)據(jù)進行排序,對于基本數(shù)據(jù)類型,其排序方式比較簡單,只需要調用內(nèi)置算法即可實現(xiàn),但對于自定義數(shù)據(jù)類型以及自定義排序規(guī)則的情況實現(xiàn)起來就比較麻煩,所以在本文章中將詳細介紹一下在中C#中如何對數(shù)據(jù)進行排序,需要的朋友可以參考下
    2024-01-01
  • C# 打開藍牙設置界面的兩種方法

    C# 打開藍牙設置界面的兩種方法

    這篇文章主要介紹了C# 打開藍牙設置界面的兩種方法,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論

贡觉县| 合作市| 微博| 闻喜县| 昆明市| 正定县| 怀仁县| 麻城市| 泗洪县| 临颍县| 措勤县| 秭归县| 荣昌县| 萨迦县| 土默特左旗| 昭觉县| 兴业县| 石家庄市| 阿拉善盟| 含山县| 克东县| 乳源| 盱眙县| 朝阳县| 曲麻莱县| 商洛市| 江油市| 慈利县| 铁力市| 新龙县| 苏尼特右旗| 清苑县| 孝感市| 揭东县| 呼伦贝尔市| 耿马| 罗江县| 西藏| 扎鲁特旗| 台前县| 乌海市|