当前位置: 首页 > 编程笔记 >

C#实现FTP客户端的案例

宇文德明
2023-03-14
本文向大家介绍C#实现FTP客户端的案例,包括了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客户端java实现。我所要做的就是连接到FTP服务器并将一个文件传输到服务器。 我设法与ftp服务器建立了连接(见下面的代码),之后我使用PASV命令进入了被动模式。现在我不知道下一步该做什么。我尝试在PASV命令之后制作一个新套接字并将其连接到FTP服务器端口20,但没有成功。 我的问题是建立连接时如何启动文件传输?(我的想法是与端口20建立连接并执行STOR命令,但我不知道如

  • 本文向大家介绍python实现简单ftp客户端的方法,包括了python实现简单ftp客户端的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现简单ftp客户端的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • FileZilla是一个开源的FTP客户端,可以在Linux和Windows等多种平台上使用。 此客户端还支持通过SFTP和FTPS的安全连接进行FTP。 您可以使用此软件在网络服务器中上传和管理文件。 当您希望上传您的网站时,文件数量或文件大小都非常大。 然后你可以使用FTP上传,因为通过cPanel文件管理器上传一个非常大的文件会导致上传错误。 大多数cPanel帐户都附带系统FTP帐户,您可

  • 很多客户使用E立方管理平台时,需要使用FTP方式完成附件或图片的传输,如何对客户端进行FTP检测呢? 下边介绍检测方法: 1、首先,客户端电脑的防火墙要开放 21号 端口 2、点击 E立方管理平台-->选项 这里有测试 3、FTP采用被动模式 选中和不选中,分别 检测 一下(检测完一种后,关闭窗体重新打开再测试另外一种) 看见如下提示就表示可以使用这种方式了 >

  • 这是一个用 C# 开发的 FTP 客户端组件

  • 有没有我可以参考的示例应用程序用于Android上的SAML交互?有人在Android上成功移植/使用了OpenSAML吗? 我正在尝试编写一个简单的应用程序,它将(而不是浏览器重定向)使用本机API来执行SAML身份验证。 还有一些指向测试环境的指针,我可以在其中测试SAML客户机,这会有所帮助。

  • 利用 select 实现的 tcp 客户端 利用 select 实现的 tcp 客户端 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* 程序清单:利用 selec

  • 本文向大家介绍C#实现的Socket服务器端、客户端代码分享,包括了C#实现的Socket服务器端、客户端代码分享的使用技巧和注意事项,需要的朋友参考一下 服务端: 客户端: