博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现FTP文件夹下载功能【转载】
阅读量:6940 次
发布时间:2019-06-27

本文共 5089 字,大约阅读时间需要 16 分钟。

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

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

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

 

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

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

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

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

 

///         /// 单个文件下载方法         ///         /// 保存文件的本地路径        /// 下载文件的FTP路径        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();        }

 

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

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

///         /// FTP地址路径        /// 我们所选择的文件或者文件夹名字        /// 要发送到FTP服务器的命令        /// 
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; }

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

///         /// 下载方法KO        ///         /// FTP路径        /// 需要下载文件路径        /// 保存的本地路径        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)                {                    //判断是否具有文件夹标识
if (names.Contains("
")) { string olname = names.Split(new string[] { "
" }, 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文件夹下载方法就完全实现 ;-)

转载地址:http://bzinl.baihongyu.com/

你可能感兴趣的文章
关于echarts的那些事(地图标点,折线图,饼图)
查看>>
ExecutorService 的理解与使用
查看>>
[Javascript Crocks] Flatten Nested Maybes with `chain`
查看>>
【转载并记录】SpringBoot 入门(一)
查看>>
我的第一个python web开发框架(30)——定制ORM(六)
查看>>
performselectoronmainthread
查看>>
产品经理必须要了解的26个文档
查看>>
grep的两个替代品(补充?)
查看>>
HDOJ---1068 Girls and Boys[匈牙利算法]
查看>>
POJ-2528 Mayor's posters (点树+离散) 线段树 ----------------------转
查看>>
Create a Git Mirror (for your hg repository) / hg tip
查看>>
[转]sql server 存储过程中变量表与临时表的分析比较
查看>>
无法启动程序“http://localhost:3303/Default.aspx”
查看>>
SQL 把字符创分割成两个字符串
查看>>
java使用JNDI 获取weblogic配置的数据源 连接数据库
查看>>
大年初七回杭州
查看>>
Java--选择排序,冒泡排序
查看>>
MySQL 时间戳(Timestamp)函数
查看>>
免费的jquery ui 收集
查看>>
启动Windows virtual pc XPMODE
查看>>