C#实现FTP文件夹下载功能【转载】

2023-11-20

  网上有很多FTP单个文件下载的方法,前段时间需要用到一个FTP文件夹下载的功能,于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码。

      实现的思路主要是通过遍历获得文件夹下的所有文件,当然,文件夹下可能仍然存在文件夹,这样就需要结合递归这种方法来实现对一个我们指定的文件夹获得其下的所有文件。最后通过一个下载方法来逐级将文件夹内的每个文件下载到本地。

有关递归的MSDN在线帮助--http://msdn.microsoft.com/zh-cn/library/z3dk2cc3.aspx

 

下面我们来逐步实现这个下载方法!

首先引用需要在程序中用到的类库

using System.Text;
using System.Net;
using System.IO;

 整个程序大致可以分为2个部分,第一部分是实现单个文件下载的方法 

 

        /// <summary>
        /// 单个文件下载方法
         /// </summary>
        /// <param name="adss">保存文件的本地路径</param>
        /// <param name="ftpadss">下载文件的FTP路径</param>
        public void download(string adss, string ftpadss)
        {
            //FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。
            //FileMode.Create如果文件已存在,它将被改写
            FileStream outputStream = new FileStream(adss, FileMode.Create);
            FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpadss));
            //设置要发送到 FTP 服务器的命令
            downRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            FtpWebResponse response = (FtpWebResponse)downRequest.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];
            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }
            ftpStream.Close();
            outputStream.Close();
            response.Close();
        } 

 

  第二个部分也就是需要遍历出我们所指定的文件夹内所有内容 

  首先是一个单个遍历文件夹获取文件夹下所有文件信息的方法  

        /// </summary>
        /// <param name="ftpads">FTP地址路径</param>
        /// <param name="name">我们所选择的文件或者文件夹名字</param>
        /// <param name="type">要发送到FTP服务器的命令</param>
        /// <returns></returns>
        public string[] ftp(string ftpads,string name,string type)
        {
            WebResponse webresp = null;
            StreamReader ftpFileListReader = null;
            FtpWebRequest ftpRequest=null;
            try
            {
                 ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpads + name));
                 ftpRequest.Method = type;
                 webresp = ftpRequest.GetResponse();
                 ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
            }
            catch(Exception ex)
            {
                ex.ToString();
                
            }
            StringBuilder str = new StringBuilder();
            string line=ftpFileListReader.ReadLine();
            while (line != null)
            {
                str.Append(line);
                str.Append("/n");
                line = ftpFileListReader.ReadLine();
            }
            string[] fen = str.ToString().Split('/n');
            return fen;
        }

 之后是一个我们实现递归文件夹的方法 

        /// <summary>
        /// 下载方法KO
        /// </summary>
        /// <param name="ftpads">FTP路径</param>
        /// <param name="name">需要下载文件路径</param>
        /// <param name="Myads">保存的本地路径</param>
        public void downftp(string ftpads, string name,string Myads)
        {
            string downloadDir = Myads + name;
            string ftpdir = ftpads + name;
            string[] fullname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectoryDetails);
            //判断是否为单个文件 
            if (fullname.Length <= 2)
            {
                if (fullname[fullname.Length - 1] == "")
                {
                    download(downloadDir + "/" + name, ftpads + name + "/" + name);
                }
            }
            else
            {
                string[] onlyname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectory);
                if (!Directory.Exists(downloadDir))
                {
                    Directory.CreateDirectory(downloadDir);
                }
                foreach (string names in fullname)
                {
                    //判断是否具有文件夹标识<DIR>
                    if (names.Contains("<DIR>"))
                    {
                        string olname = names.Split(new string[] { "<DIR>" }, 
                        StringSplitOptions.None)[1].Trim();
                        downftp(ftpdir, "//" + olname, downloadDir);
                    }
                    else
                    {
                        foreach (string onlynames in onlyname)
                        {
                            if (onlynames == "" || onlynames == " " || names == "")
                            {
                                break;
                            }
                            else
                            {
                                if (names.Contains(" " + onlynames))
                                {
                                    download(downloadDir + "/" + onlynames, ftpads + name + "/" + 
                                    onlynames);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            
        }

      在使用WebRequestMethods.Ftp.ListDirectoryDetails取得文件夹下所有内容时,会发现如果其中有文件夹,那么文件夹的的详细信息中会有一个"<DIR>"标识,我们就可以通过这个来将其区分开来

      同时在获取文件夹以及文件名称时用到WebRequestMethods.Ftp.ListDirectory,这个指令能过只获得文件夹下所有文件包括文件夹的名字,通过这两个指令所获取的信息逐一比较,便能确定出文件或文件夹名以传递到download和downftp方法中

      这样,一个简单的FTP文件夹下载方法就完全实现 ;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#实现FTP文件夹下载功能【转载】 的相关文章

随机推荐

  • c语言中头文件iostream,程序中为什么要包含头文件iostream.h?

    1 C 增加了名称空间概念 借以将原来声明在全局空间下的标识符声明在了namespace std下 2 统一C 各种后缀名 如 h hpp hxx等 标准化之前的头文件就是带后缀名的文件 标准化后的头文件就是不带后缀名的文件 C 98 规定
  • “挖矿”【题解】

    题目 题目描述 有N名矿工在挖矿 工厂预先给第i名矿工支付了M i 元工资 他每挖一吨矿需要消费K i 元 如果他手头余下的钱不足K i 元 他就停止挖矿 他每挖一吨矿 工厂会立即奖励他2元钱 奖励的钱也可以用 于挖矿的消费 给出矿工的信息
  • Design Compiler (八)——DC的逻辑综合与优化

    对进行时序路径 工作环境 设计规则等进行约束完成之后 DC就可以进行综合 优化时序了 DC的优化步骤将在下面进行讲解 然而 当普通模式下不能进行优化的 就需要我们进行编写脚本来改进DC的优化来达到时序要求 理论部分以逻辑综合为主 不涉及物理
  • 基于STM32F1系列芯片的OV7670颜色,形状识别

    在用ov7670做颜色识别的时候遇到一些问题 查阅很多资料才弄明白 遂整理一下 一 腐蚀中心 int SearchCenter uint16 t x uint16 t y const TARGET CONDITION t condition
  • #挑战Open AI!马斯克宣布成立xAI,你怎么看?# 马斯克的xAI:充满困难与希望

    文章目录 1 什么是xAI公司 2 xAI公司的图标 3 反AI斗士 马斯克进军AI 期待与挑战并存 3 1 关于马斯克 3 2 这位 反AI斗士 3 3 我的看法 3 4 可能会遇到的困难与优势 3 5 蓄谋已久的马斯克 3 6 xAI
  • python爬取基金_Python爬虫爬取基金数据

    1 程序结构介绍 代码结构图 代码结构图 代码目录结构 代码目录结构 结果图 结果图 2 数据源网站 3 GitHub地址 4 文件代码 main py from get fund code import from get fund dat
  • easyExcel实战:(五)写Excel设置excel的样式

    一 主要是设置Excel的字体大小和颜色 目前还不支持单元格内容居中和自动适应宽度 定义Excel正文背景颜色 TableStyle tableStyle new TableStyle tableStyle setTableContentB
  • mq的基本介绍和基本用法

    1 什么是MQ 有什么用 MQ 是message queue 消息队列 也叫消息中间件 遵守JMS java message service 规范的一种软件 同时还有另一个叫AMQP的应用层协议 语言无关性不受产品 语言等限制 rabbit
  • Java按顺序打印数字的每一位详解

    题目要求 输入一个数字 按顺序打印一个数字的每一位 例如 1234 打印出 1 2 3 4 用递归实现 实现代码 import java util Scanner public class blank40 public static voi
  • aarch64架构CPU的docker中ubuntu18.04,20.04,22.04等系统apt update均报错的原因

    宿主及环境为aarch64的CPU的Ubuntu18 04 docker版本为自带的19 03 6 对于Ubuntu14 04 16 04 18 04这个原因很乌龙 之前百度搜索结果也都不对 最终原因竟然只是因为网络问题 早上8点左右我到公
  • PySide2按钮传递参数以及*args,**kargs的含义

    1 PySide2按钮传递参数 lambda 表达式 self set priV on set clicked connect lambda self set priV con 1 def set priV con self valueV
  • Communications link failure问题解决方案摸索

    性能测试发现了Communications link failure错误 搜寻了网络上的好多种解决方案 记录总结一下 错误信息 Communications link failure The last packet sent success
  • 1037 在霍格沃茨找零钱

    1037 在霍格沃茨找零钱 20 20 分 如果你是哈利 波特迷 你会知道魔法世界有它自己的货币系统 就如海格告诉哈利的 十七个银西可 Sickle 兑一个加隆 Galleon 二十九个纳特 Knut 兑一个西可 很容易 现在 给定哈利应付
  • python读取文件时出现\ufeff非法字符的处理思路

    现象 系统环境 操作系统 Microsoft Windows 10 家庭中文版 10 0 1904 Python Python 3 8 8 问题 如下图所示 利用python读取文件后 在对字符串进行处理时 会出现 ufeff字符 这对基于
  • python读取excel成绩表,并设置柱状图

    目录 1 导入相关的包 2 读取excel文件 提取语文的数据 3 画柱状图的代码 4 完整代码 5 效果图 1 导入相关的包 import pandas as pd import matplotlib pyplot as plt 2 读取
  • 网管员牢记 10种较为常见的服务器管理错误

    网管员牢记 10种较为常见的服务器管理错误 网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管
  • angular 4 httpClient 数据访问

    服务里 是用来请求api的一个模块 使用httpClient服务请求数据常用方法如下 http get url subscribe export class ApiService 登录 一种是url是不变的 只需传参 login userN
  • VS项目属性的一些配置项的总结(important)

    以下内容为 原创 转载 首先 解决方案和项目文件夹包含关系 c 项目 VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系 假设新建一个项目ssyy 解决方案起名fangan 注意解决方案包括项目 此时生成的最外层目录为
  • 性能诊断定位之内存问题排查(四):CentOS7系统中,JVM内存诊断

    目录 1 要求 2 处理思路 3 示例演示 CentOS7 环境中 3 1 环境工具 3 2 操作步骤 3 2 1 JForum环境配置 配置在tomcat中 启动Tomcat 3 2 2 编写JMeter脚本 脚本的编写和运行 在win1
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需