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);
}
}
您的条件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();
没有真正的目的。最好将文件名设置为字符串。在进入循环之前清空。