现在的位置: 首页 > 综合 > 正文

c# ftp 目录下载

2013年12月18日 ⁄ 综合 ⁄ 共 8548字 ⁄ 字号 评论关闭

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Collections;

namespace FtpTest
{
    class DownloadFolder
    {
        #region 单个文件下载
        /// <summary>
        /// 单个文件下载方法
        /// </summary>
        /// <param name="adss">保存文件的本地路径</param>
        /// <param name="remotePaths">下载文件的FTP路径</param>
        public static void download(string adss, string remotePaths)
        {
            //FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。
            //FileMode.Create如果文件已存在,它将被改写
            FileStream outputStream = new FileStream(adss, FileMode.Create);
            FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(remotePaths));
            downRequest.UseBinary = true;
            downRequest.Credentials = new NetworkCredential("zhang","zhang");
            //设置要发送到 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();
        }
        #endregion

        #region 得到ftp服务器端指定文件夹下的目录
        /// </summary>
        /// <param name="remotePath">FTP地址路径</param>
        /// <param name="name">我们所选择的文件或者文件夹名字</param>
        /// <param name="type">要发送到FTP服务器的命令</param>
        /// <returns></returns>
        public static string[] ftp(string remotePath,string name,string type)
        {
            WebResponse webresp = null;
            StreamReader ftpremoteFileListReader = null;
            FtpWebRequest ftpRequest=null;
            try
            {
                 ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(remotePath +"/" + name));
                 ftpRequest.Method = type;
                 ftpRequest.Credentials = new NetworkCredential("zhang", "zhang");
                 webresp = ftpRequest.GetResponse();
                 ftpremoteFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.UTF8);
            }
            catch(Exception ex)
            {
                ex.ToString();
                
            }
            StringBuilder str = new StringBuilder();
            string line=ftpremoteFileListReader.ReadLine();
            while (line != null)
            {
                str.Append(line);
                str.Append("\n");
                line = ftpremoteFileListReader.ReadLine();
            }
            string[] fen = str.ToString().Split('\n');
            return fen;
        }
        #endregion

        #region 下载文件夹
        /// <summary>
        /// 下载方法
        /// </summary>
        /// <param name="remotePath">FTP路径</param>
        /// <param name="name">需要下载文件路径</param>
        /// <param name="localPath">保存的本地路径</param>
        public static void downftp(string remotePath, string name, string localPath)
        {
            string downloadLocalPath = localPath + "/" + name;
            string downloadRemotePath = remotePath + "/" + name;
            string[] remoteDetails = ftp(remotePath, name, WebRequestMethods.Ftp.ListDirectoryDetails);
            //判断是否为单个文件 
            if (remoteDetails.Length <= 2)
            {
                if (remoteDetails[remoteDetails.Length - 1] == "")
                {
                    download(downloadLocalPath, downloadRemotePath);
                }
            }
            else
            {
                string[] remoteFiles = ftp(remotePath, name, WebRequestMethods.Ftp.ListDirectory);
                Hashtable remoteFileList = new Hashtable();
                foreach (string fileName in remoteFiles)
                {
                    if (fileName == "")
                        continue;
                    remoteFileList.Add(fileName, fileName);
                }
                DirectoryInfo d = new DirectoryInfo(downloadLocalPath);
                if (!d.Exists)
                {
                    d.Create();
                }
                foreach (string remoteFileOrFolder in remoteDetails)
                {
                    if (remoteFileOrFolder == "")
                        continue;
                    string[] ss = remoteFileOrFolder.Split(' ');
                    List<string> info = new List<string>();
                    foreach (string a in ss)
                    {
                        if (a != "")
                            info.Add(a);
                    }
                    string shortName = info[info.Count - 1];
                    if (shortName == "." || shortName == "..")
                        continue;
                    //判断是否具有文件夹标识<DIR>
                    if (!isNotFolder(shortName, remoteFileList))
                    {
                        downftp(downloadRemotePath, shortName, downloadLocalPath);
                    }
                    else
                    {
                        download(downloadLocalPath + "/" + shortName, downloadRemotePath + "/" +
                        shortName);  
                    }
                }
            }
            Console.WriteLine("传输完毕");
        }
        #endregion

        #region 判断fileName是一个文件
        /// <summary>
        /// 判断fileName是一个文件
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="table"></param>
        /// <returns></returns>
        public static bool isNotFolder(string fileName,Hashtable table)
        {
            bool flag = false;
            foreach (DictionaryEntry each in table)
            {
                if(fileName == each.Value.ToString())
                {
                    flag = true;
                    break;
                }
            }
            return flag;
        }
        #endregion
    }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Examples.System.Net;
using System.IO;

namespace FtpTest
{
    class Program
    {
        public static bool DisplayFileFromServer(Uri serverUri)
        {
            // The serverUri parameter should start with the ftp:// scheme.
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return false;
            }
            // Get the object used to communicate with the server.
            WebClient request = new WebClient();

            // This example assumes the FTP site uses anonymous logon.
            request.Credentials = new NetworkCredential("zhang", "zhang");
            try
            {
                byte[] newFileData = request.DownloadData(serverUri.ToString());
                string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
                Console.WriteLine(fileString);
            }
            catch (WebException e)
            {
                Console.WriteLine(e.ToString());
            }
            return true;
        }

        public static bool DeleteFileOnServer(Uri serverUri)
        {
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return false;
            }
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
            request.Credentials = new NetworkCredential("zhang","zhang");
            request.Method = WebRequestMethods.Ftp.DeleteFile;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Console.WriteLine("Delete State :{0}",response.StatusDescription);
            response.Close();
            return true;
        }

        #region 异步上传文件
        /// <summary>
        /// 
        /// </summary>
        /// <param name="localPath">本地文件路径如:@"D://zhang.txt"</param>
        /// <param name="remotePath">服务器端路径:ftp://127.0.0.1/</param>
        /// <param name="fileName">在服务器端的文件名</param>
        /// <returns></returns>
        public static bool AsynUploadFile(string localPath,string remotePath,string fileName)
        {
            return AsynchronousFtpUpLoader.AsynUploadFile(localPath, remotePath, fileName);
        }

        #endregion

        #region 获取服务器端文件列表
        /// <summary>
        /// 获取服务器端文件列表
        /// </summary>
        /// <param name="serverUri">服务器端路径</param>
        /// <param name="userName">用户名</param>
        /// <param name="pass">密码</param>
        /// <returns></returns>
        public static string[] GetFileListFromServer(Uri serverUri, string userName, string pass)
        {
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return null;
            }
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
            request.UseBinary = true;
            request.Credentials = new NetworkCredential(userName,pass);
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string line = reader.ReadLine();
            StringBuilder result = new StringBuilder();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
              
            }
            Console.WriteLine(result);
            //result.Remove(result.ToString().LastIndexOf('\n'), 1);
            reader.Close();
            response.Close();
            return result.ToString().Split('\n');
        }
        #endregion

        #region  下载文件夹
        /// <summary>
        /// 下载文件夹
        /// </summary>
        /// <param name="ftpads"></param>
        /// <param name="name"></param>
        /// <param name="Myads"></param>
        public static void DownLoadFolder(string ftpads, string name, string Myads)
        {
            DownloadFolder.downftp(ftpads,name,Myads);
        }
        #endregion
        static void Main(string[] args)
        {
            /*Uri uri = new Uri("ftp://127.0.0.1/zhang.txt");
            //Program.DisplayFileFromServer(uri);
            Program.DeleteFileOnServer(uri);
            Console.ReadKey();*/

            //Program.AsynUploadFile(@"D://zhang.txt","ftp://127.0.0.1","long.txt");

            //Program.getFileListFromServer(new Uri("ftp://127.0.0.1/Test"),"zhang","zhang");

            Program.DownLoadFolder("ftp://127.0.0.1", "", @"D://Test");
            Console.ReadKey();
        }
    }
}

运行成功

抱歉!评论已关闭.