C# ftp子文件夹下载递归功能不工作

C# ftp子文件夹下载递归功能不工作,c#,asp.net,.net,ftp,C#,Asp.net,.net,Ftp,我正在尝试从c#中的ftp下载所有文件,包括子文件夹 我创建了用于子文件夹递归的DownloadDiretory和用于下载文件的DownloadFtpFile 该代码对于根文件夹文件下载工作正常,但不会下载任何子文件夹文件 有什么建议吗 提前谢谢 public static void DownloadDiretory(string folderPath) { try { ConnectionsXml objXml = ne

我正在尝试从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);
        }
    }
publicstaticvoid下载目录(stringfolderpath)
{
尝试
{
ConnectionsXml objXml=新的ConnectionsXml();
AccountFtp account=objXml.GetAccountFtpDetails();
FtpWebRequest=(FtpWebRequest)WebRequest.Create(“ftp://“+account.Website+”/“+folderPath”);
request.Method=WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials=新的网络凭据(account.UserId、account.Password);
请求超时=360000;
FtpWebResponse response=(FtpWebResponse)request.GetResponse();
//FtpWebResponse response=GetFtpResponse(folderPath);
Stream responseStream=response.GetResponseStream();
StreamReader=新的StreamReader(responseStream,true);
字符串文件名;
而(!reader.EndOfStream)
{
filename=string.Empty;
filename=reader.ReadLine();
if(filename.Contains(“”)
{
filename=filename.Substring(filename.IndexOf(“,0)+5,filename.Length-(filename.IndexOf(“,0)+5));
filename=filename.Trim();
下载目录(文件夹路径+“/”+文件名);
}
其他的
{
string[]files=filename.Split(“”);
filename=files[files.Length-1];
下载ftpfile(文件夹路径,文件名);
}
}
responseStream.Close();
response.Close();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
公共静态void DownloadFtpFile(字符串folderName,字符串文件名)
{
尝试
{
ConnectionsXml objXml=新的ConnectionsXml();
AccountFtp account=objXml.GetAccountFtpDetails();
string path=“ftp://”+account.Website+“/”+folderName+“/”+文件名;
FtpWebRequest=(FtpWebRequest)WebRequest.CreateDefault(新Uri(路径));
request.Method=WebRequestMethods.Ftp.DownloadFile;
request.Credentials=新的网络凭据(account.UserId、account.Password);
//请求超时=360000;
request.KeepAlive=false;
request.usesponsive=true;
request.UseBinary=true;
FtpWebResponse response=(FtpWebResponse)request.GetResponse();
Stream responseStream=response.GetResponseStream();
如果(!Directory.Exists(@“F:\MPR\”+folderName))
{
CreateDirectory(@“F:\MPR\”+folderName);
}
FileStream FileStream=新的FileStream(@“F:\MPR\”+文件夹名+@“\”+文件名,FileMode.Create);
byte[]bytesbuffer=新字节[32*1024];
int byteRead=responseStream.Read(字节缓冲区,0,2048);
while(byteRead>0)
{
Write(bytesbuffer,0,byteRead);
byteRead=responseStream.Read(字节缓冲区,0,2048);
}
responseStream.Close();
fileStream.Close();
response.Close();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}

您的条件
filename.Contains(“DIR”)
似乎不正确。我没有可用的专用ftp服务器,所以我尝试了。文件夹“incoming”返回为

"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();
没有真正的目的。最好在进入循环之前将filename设置为string.Empty