C# 实现FTP客户端的小例子

 更新时间:2020年07月10日 10:54:07   作者:Alan.hsiang  
这篇文章主要介绍了C# 如何实现FTP客户端,文中实例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

本文是利用C# 实现FTP客户端的小例子,主要实现上传,下载,删除等功能,以供学习分享使用。

思路:

  • 通过读取FTP站点的目录信息,列出对应的文件及文件夹。
  • 双击目录,则显示子目录,如果是文件,则点击右键,进行下载和删除操作。
  • 通过读取本地电脑的目录,以树状结构展示,选择本地文件,右键进行上传操作。

涉及知识点:

  • FtpWebRequest【实现文件传输协议 (FTP) 客户端】 / FtpWebResponse【封装文件传输协议 (FTP) 服务器对请求的响应】Ftp的操作主要集中在两个类中。
  • FlowLayoutPanel  【流布局面板】表示一个沿水平或垂直方向动态排放其内容的面板。
  • 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 属性与构造函数

  /// <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,将命令发往Ftp并返回信息
  /// </summary>
  /// <param name="method">要发往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内容类型枚举
 /// </summary>
 public enum FtpContentType
 {
  undefined = 0,
  file = 1,
  folder = 2
 }
}

FTP服务端和客户端示意图

以上就是C# 实现FTP客户端的小例子的详细内容,更多关于C# 实现FTP客户端的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈C#索引器

    浅谈C#索引器

    这篇文章主要简单介绍C#索引器,索引器使你可从语法上方便地创建类、结构或接口,以便客户端应用程序可以像访问数组一样访问它们。编译器将生成一个 Item 属性和适当的访问器方法,在主要目标是封装内部集合或数组的类型中,常常要实现索引器,下面我们一起来看看具体内容吧
    2021-11-11
  • C#多线程系列之线程完成数

    C#多线程系列之线程完成数

    本文详细讲解了C#多线程中的线程完成数,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • c# 面试必备线程基础知识点

    c# 面试必备线程基础知识点

    这篇文章主要介绍了c# 面试必备线程基础知识点,帮助大家更好的巩固,掌握线程的基础知识,感兴趣的朋友可以了解下
    2020-11-11
  • C# DataGridView中实现勾选存储数据和右键删除数据(示例代码)

    C# DataGridView中实现勾选存储数据和右键删除数据(示例代码)

    这篇文章主要介绍了C# DataGridView中实现勾选存储数据和右键删除数据的示例代码,通过示例代码给大家展示运行效果图,需要的朋友可以参考下
    2021-07-07
  • 基于WPF实现简单的下拉筛选控件

    基于WPF实现简单的下拉筛选控件

    这篇文章主要为大家详细介绍了如何基于WPF实现简单的下拉筛选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-04-04
  • C#实现销售管理系统

    C#实现销售管理系统

    这篇文章主要为大家详细介绍了C#实现销售管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C#实现对文件进行加密保护的示例代码

    C#实现对文件进行加密保护的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现对文件进行加密保护的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下
    2015-07-07
  • winform中的ListBox和ComboBox绑定数据用法实例

    winform中的ListBox和ComboBox绑定数据用法实例

    这篇文章主要介绍了winform中的ListBox和ComboBox绑定数据用法,实例分析了将集合数据绑定到ListBox和ComboBox控件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Unity中3DText显示模糊不清的解决方案

    Unity中3DText显示模糊不清的解决方案

    这篇文章主要介绍了Unity中3DText显示模糊不清的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论