zoukankan      html  css  js  c++  java
  • C#遍历FTP文件夹/下载

    原文链接:http://blog.csdn.net/ou8811/article/details/5295780

     

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

    [c-sharp] view plaincopy
    /// <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();  
    }  
    

      

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

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

    [c-sharp] view plaincopy
    /// </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;  
    }  
    

    难以避免文件夹里还有文件夹 之后是一个我们实现递归文件夹的方法

    [c-sharp] view plaincopy
    /// <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方法中

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/Events/p/3316095.html
Copyright © 2011-2022 走看看