C# 通过FTP递归列出所有文件和目录:基础连接已关闭:服务器违反了协议
我需要列出所有文件和文件夹(所有包含子文件夹的文件) 所以我使用控制台应用程序进行测试 这是我的源代码 仅用于调试的参数计数C# 通过FTP递归列出所有文件和目录:基础连接已关闭:服务器违反了协议,c#,exception,ftpwebrequest,C#,Exception,Ftpwebrequest,我需要列出所有文件和文件夹(所有包含子文件夹的文件) 所以我使用控制台应用程序进行测试 这是我的源代码 仅用于调试的参数计数 publicstaticlist-GetFile(stringbaseurl、stringusername、stringpwd、int-count=0) { 列表结果=新列表(); FtpWebRequest ftp=null; 列表文件名=新列表(); List fileDetails=新列表(); WebResponse=null; 尝试 { ftp=CreateRe
publicstaticlist-GetFile(stringbaseurl、stringusername、stringpwd、int-count=0)
{
列表结果=新列表();
FtpWebRequest ftp=null;
列表文件名=新列表();
List fileDetails=新列表();
WebResponse=null;
尝试
{
ftp=CreateRequest(baseUrl、用户名、pwd、WebRequestMethods.ftp.ListDirectory);
response=ftp.GetResponse();
使用(StreamReader sr1=newstreamreader(response.GetResponseStream(),Encoding.Default))
{
字符串str=sr1.ReadLine();
而(!string.IsNullOrWhiteSpace(str))
{
文件名。添加(str);
str=sr1.ReadLine();
}
response.Close();
}
ftp=CreateRequest(baseUrl、用户名、pwd、WebRequestMethods.ftp.ListDirectoryDetails);
使用(response=ftp.GetResponse())
使用(StreamReader sr1=newstreamreader(response.GetResponseStream(),Encoding.Default))
{
...
}
if(fileDetails.Count>0&&fileNames.Count>0)
{
foreach(文件名中的var c)
{
if(!string.IsNullOrWhiteSpace(fileDetails.FirstOrDefault(d=>d.Contains(c)&&d.StartsWith(“d”))
{
//目录
添加($“{baseUrl}/{c}”);
AddRange(GetFile($“{baseUrl}/{c}”,用户名,pwd,count+=1));
}
其他的
{
添加($“{baseUrl}/{c}”);
}
}
}
}
捕获(例外情况除外)
{
Add(count.ToString());
结果.添加(例如消息);
}
最后
{
if(响应!=null)
{
response.Close();
response.Dispose();
}
}
返回结果;
}
有时我会遇到这样的异常:
System.Net.WebException:'基础连接已关闭:服务器违反了协议。'
我怎样才能解决这个问题?
此异常不会同时抛出
因此,可能是服务器端出现了这个问题?例外情况似乎很明显。不过,您是否在另一个FTP服务器上尝试了您的代码?我没有其他FTP服务器,我假设您正在本地测试。您现在正在使用哪个FTP服务器应用程序?您可能想在您的计算机上安装另一个FTP服务器,然后重试连接。FTP服务器是官方环境,我将构建一个本地服务器并执行另一个测试。服务器似乎有问题。我设置了一个FTP服务器,它可以放置大约10000个文件和文件夹,但可以正常执行。谢谢你的帮助,我没有想到这个测试方法
public static List<string> GetFile(string baseUrl, string username, string pwd, int count = 0)
{
List<string> result = new List<string>();
FtpWebRequest ftp = null;
List<string> fileNames = new List<string>();
List<string> fileDetails = new List<string>();
WebResponse response = null;
try
{
ftp = CreateRequest(baseUrl, username, pwd, WebRequestMethods.Ftp.ListDirectory);
response = ftp.GetResponse();
using (StreamReader sr1 = new StreamReader(response.GetResponseStream(), Encoding.Default))
{
string str = sr1.ReadLine();
while (!string.IsNullOrWhiteSpace(str))
{
fileNames.Add(str);
str = sr1.ReadLine();
}
response.Close();
}
ftp = CreateRequest(baseUrl, username, pwd, WebRequestMethods.Ftp.ListDirectoryDetails);
using (response = ftp.GetResponse())
using (StreamReader sr1 = new StreamReader(response.GetResponseStream(), Encoding.Default))
{
...
}
if (fileDetails.Count > 0 && fileNames.Count > 0)
{
foreach (var c in fileNames)
{
if (!string.IsNullOrWhiteSpace(fileDetails.FirstOrDefault(d => d.Contains(c) && d.StartsWith("d"))))
{
//Directory
result.Add($"{baseUrl}/{c}");
result.AddRange(GetFile($"{baseUrl}/{c}", username, pwd, count += 1));
}
else
{
result.Add($"{baseUrl}/{c}");
}
}
}
}
catch (Exception ex)
{
result.Add(count.ToString());
result.Add(ex.Message);
}
finally
{
if (response != null)
{
response.Close();
response.Dispose();
}
}
return result;
}