C# ftp子文件夹下载递归功能不工作
我正在尝试从c#中的ftp下载所有文件,包括子文件夹 我创建了用于子文件夹递归的DownloadDiretory和用于下载文件的DownloadFtpFile 该代码对于根文件夹文件下载工作正常,但不会下载任何子文件夹文件 有什么建议吗 提前谢谢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
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