通过FTP递归列出所有文件和目录:基础连接已关闭:服务器违反了协议

时间:2018-08-22 04:08:28

标签: c# exception ftpwebrequest

我需要列出所有文件和文件夹(所有包含子文件夹的文件)。

所以我使用控制台应用程序进行测试。

这是我的源代码。

仅用于调试的参数计数

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

有时候我会得到这样的异常:

  

System.Net.WebException:'基础连接已关闭:服务器违反了协议。'

如何解决此问题? 此异常不会同时抛出

那么也许是服务器端出现的这个问题?

0 个答案:

没有答案