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# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 如何解决“HTTP 错误 404.3 - 未找到”错误?

    简单的问题 我启动 VS2008 并创建一个新的 WCF 服务应用程序 这将创建一个默认应用程序 并使用一些测试方法来显示它的工作原理 我按 CTRL F5 确实有效 伟大的 但是 它使用 Visual Studio 开发服务器 我不想支持
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • JObject ToString 与 StringEnumConverter 不起作用

    我正在尝试序列化一个匿名类 如下所示 public enum ErrorCode A B C var response JObject FromObject new Error new Message Test Code ErrorCode
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 将 size_t 变量添加到指针

    我想向指针添加 size t 类型 有些像这样 void function size t sizeA size t sizeB void pointer pointer malloc sizeA pointer pointer sizeB
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • 产量回报延迟迭代问题

    我知道yield return 利用了延迟加载 但我想知道我是否可能滥用迭代器或者很可能需要重构 我的递归迭代器方法返回给定的所有祖先PageNode包括pageNode itself public class PageNodeIterat
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • C# - 平移光标

    我正在 PictureBox 控件中实现大图像的平移 并且设置适当的方向平移光标没有问题 但是 我似乎找不到用于平底锅原点的图像 内部带有箭头的圆圈 我在哪里可以找到它 我觉得image您正在寻找的内容未包含在框架中 每个应用程序都使用自己
  • XslCompiledTransform 和自定义 XmlUrlResolver:“具有相同键的条目已存在”

    有没有办法调试由自定义 XmlUrlResolver 从数据库加载的 XSLT 文档 或者有人知道下面的错误消息是关于什么的吗 我有一个导入通用 xslt 文档的 XSLT 样式表

随机推荐

  • 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文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需