Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过FTP递归列出所有文件和目录:基础连接已关闭:服务器违反了协议_C#_Exception_Ftpwebrequest - Fatal编程技术网

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;
}