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

网上有很多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文件夹下载方法就完全实现 ;-)

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

时间: 2024-10-13 22:34:00

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

beyond compare ftp 文件夹同步

因为经常要同步服务器上的代码,今天试了一下beyond compare 的ftp同步非常爽.以前都只用了beyond compare的文件夹比较功能了,ftp功能没有使用过. 步骤1:点击:会话-->新建会话-->文件夹同步 步骤2:点击下面的红色按键 步骤3:选择好ftp服务器的相关目录. 步骤4:选择右侧比较文件夹,选择比较规则,同步规则 步骤5:接下来就会列举出两边目录的差异了,点击"现在同步"就可以把左侧的目录同步了 beyond compare ftp 文件夹同步

开放Nginx在文件夹列表功能

nginx在列出的默认同意整个文件夹.你怎么转Nginx在文件夹列表功能?打开nginx.conf文件.在location server 要么 http段增加 autoindex on;另外两个參数最好也加上去:autoindex_exact_size on;显示出文件的确切大小.单位是bytes. 改为off后,显示出文件的大概大小,单位是kB或者MB或者GBautoindex_localtime on;默觉得off.显示的文件时间为GMT时间. 改为on后,显示的文件时间为文件的服务器时间

Ubuntu根目录下各文件夹的功能详细介绍

Ubuntu的根目录下存在着很多的文件夹,但你知道他们都存放着哪些文件呢?这些是深入了解Ubuntu系统必不缺少的知识,本文就关于此做一下介绍吧. /bin/    用以存储二进制可执行命令文件. /sbin/    许多系统命令的存储位置,/usr/sbin/中也包括了许多命令. /root/    超级用户,即根用户的主目录. /home/    普通用户的默认目录,在该目录下,每个用户拥有一个以用户名命名的文件夹. /boot/    存放Ubuntu内核和系统启动文件. /boot/gr

.net MVC项目中每个文件夹的功能

App_Data:一个比较特殊的文件夹,把文件放到这个文件夹,通过地址访问是访问不到的,ASP.NET会帮我们屏蔽掉.通常放一些数据库文件.xml配置文件以防止数据泄露 Content:一般放CSS样式.样式图片 Controllers:放控制器文件 Models:放ViewsModels Scripts:放js.JQ Views:放试图的文件夹 Global.asax:全局应用程序

通过群晖 DSM 的 “装载远程文件夹(CIFS)” 功能来装载局域网中的 Win7 主机的指定文件或盘符

今天下午有空,就整理下电脑和 DSM 里的文件和资料,于是想把电脑里的几个盘 “映射” 到 DSM 的 File Station 中,以方便数据的搬移.这个 “映射” 就是通过 DSM 里 File Station 的 “装载远程文件夹” 来实现的,早在 DSM 版本还是 4.** 的时候就已经成功使用过,但不知道是因为没有把正确的操作回想起来还是 DSM 的操作变了,今天想用起来却一直不成功,上网各种搜索查询,费了一整个下午才搞成功.于是打算把这个设置过程记录下来,以仿今后为了相同的问题而重蹈

Java实现FTP上传下载功能

Java FTP客户端工具包很多,在此我选用的Apache的FTPClient.这个包的获取可以通过http://commons.apache.org/net/来获取,我使用的是最新的commons-net-1.4.1.zip.其中包含了众多的java网络编程的工具包,官方文档列举如下: 1.支持网络协议如下: FTP.NNTP. SMTP.POP3.Telnet.TFTP.Finger.Whois.rexec/rcmd/rlogin.Time (rdate) and Daytime.Echo.

tomcat实现文件打开下载功能

omcat作为http的下载服务器,网上有很多办法 但我认为最简单的是: 1.直接把文件放在 tomcat6/webapps/ROOT 目录下, 2.然后在网址中访问: http://192.168.2.31:8080/ + 放入目录下文件名       便可下载. 但是,如何你不想放在webapps/ROOT下,就要对想要下载的目录进行配置:   [直接在网页上显示下载目录需要点击下载] 1.在tomcat 安装目录\conf\Catalina\localhost下建立任意文件名xml文件,比

给本地服务器配置py文件的下载功能

打开以下网址 http://localhost/Myservers/test/weibo.py //本地服务器,下载Myservers目录下的test目录中的weibo.py文件 错误提示: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决文件下载办法 1.确定py的MIME类型为application/octet-stream(用application/octet-str

C# 使用ftp下载一个文件夹下的所有文件,包括子目录文件夹

这篇博客给大家补充一个方法,就是得到一个目录下的所有文件名称.在前端调用,大家写一个递归去遍历就可以了,我在这里就不在谢了.具体ftp下载的方法在我的另一篇博客里有,需要的可以去看一下. /// <summary> /// 读取文件目录下所有的文件名称,包括文件夹名称 /// </summary> /// <param name="ftpAdd">传过来的文件夹路径</param> /// <returns>返回的文件或文件夹