ftp子文件夹下载递归函数不起作用

本文关键字:递归函数 不起作用 下载 文件夹 ftp | 更新日期: 2023-09-27 18:26:32

我正在尝试从c#中的ftp下载所有文件,包括子文件夹。

我创建了用于子文件夹递归的DownloadDiretory和用于下载文件的DownloadFtpFile。

该代码适用于下载根文件夹文件,但不会下载任何子文件夹文件。

有什么建议吗?

提前感谢。

    public static void DownloadDiretory(string folderPath)
    {
        try
        {
            ConnectionsXml objXml = new ConnectionsXml();
            AccountFtp account = objXml.GetAccountFtpDetails();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + account.Website +           "/" + folderPath);
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            request.Credentials = new NetworkCredential(account.UserId, account.Password);
            request.Timeout = 360000;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            //FtpWebResponse response = GetFtpResponse(folderPath);
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream, true);
            string filename;
            while (!reader.EndOfStream)
            {
                filename = string.Empty;
                filename = reader.ReadLine();
                if (filename.Contains("<DIR>"))
                {
                    filename = filename.Substring(filename.IndexOf("<DIR>", 0) + 5, filename.Length - (filename.IndexOf("<DIR>", 0) + 5));
                    filename = filename.Trim();
                    DownloadDiretory(folderPath + "/" + filename);
                }
                else
                {
                    string[] files = filename.Split(' ');
                    filename = files[files.Length - 1];
                    DownloadFtpFile(folderPath, filename);
                }
            }
            responseStream.Close();
            response.Close();
        }
        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }
    }

    public static void DownloadFtpFile(string folderName, string fileName)
    {
        try
        {
            ConnectionsXml objXml = new ConnectionsXml();
            AccountFtp account = objXml.GetAccountFtpDetails();
            string path = "ftp://" + account.Website + "/" + folderName + "/" + fileName;
            FtpWebRequest request = (FtpWebRequest)WebRequest.CreateDefault(new Uri(path));
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential(account.UserId, account.Password);
            //request.Timeout = 360000;
            request.KeepAlive = false;
            request.UsePassive = true;
            request.UseBinary = true;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            if(!Directory.Exists(@"F:'MPR'" + folderName))
            {
                Directory.CreateDirectory(@"F:'MPR'" + folderName);
            }
            FileStream fileStream = new FileStream(@"F:'MPR'" + folderName + @"'" + fileName, FileMode.Create);
            byte[] bytesbuffer = new byte[32 * 1024];
            int byteRead = responseStream.Read(bytesbuffer, 0, 2048);
            while (byteRead > 0)
            {
                fileStream.Write(bytesbuffer, 0, byteRead);
                byteRead = responseStream.Read(bytesbuffer, 0, 2048);
            }
            responseStream.Close();
            fileStream.Close();
            response.Close();
        }
        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }
    }

ftp子文件夹下载递归函数不起作用

您的条件filename.Contains("DIR"))似乎是错误的。我没有可用的私人ftp服务器,所以我尝试了ftp://test.talia.net.文件夹"传入"作为返回

"drwxrwxr-x   2 ftp      ftp          4096 Oct 15 07:32 incoming"

文件以等形式返回

"-rw-r--r--   1 ftp      ftp      10485760 Apr 19  2006 10mb.pak"

因此,请尝试使用filename.StartsWith("d")进行检查。

此外,这些线路:

filename = string.Empty;
filename = reader.ReadLine();

没有真正的目的。最好将文件名设置为字符串。在进入循环之前清空。