如何使用uribuilder获取目录下的所有子目录

时间:2019-06-18 17:07:42

标签: c# ftp directory-listing

尝试创建一个UriBuilder,该列表将列出所有子目录以供以后使用。

我已经尝试了Microsoft提供的有关此过程的示例,并尝试使用directory.getdirectory方法没有成功。

String result = String.Empty;
Search searchResults = new Search();

try
{
    UriBuilder uriBuilder = new UriBuilder();
    uriBuilder.Scheme = "ftp";
    uriBuilder.Host = "ftp.myfilepath.com/public/doc";
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uriBuilder.Uri);

    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();

    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);
    Console.WriteLine(reader.ReadToEnd());

    Console.WriteLine($"Directory List Complete, status {response.StatusDescription}");

    reader.Close();
    response.Close();
    result = reader.ReadToEnd();

    if (result != null)
    {
        searchResults.Messages = result;
    }
}
catch (Exception ex)
{
    searchResults.Messages = "File not found.";
} 

我希望它列出在UriBuilder给定的路径下找到的目录。结果总是空白,我不明白为什么或缺少什么。

1 个答案:

答案 0 :(得分:0)

问题

忽略一些语法错误(缺少关键字var或第18和22行的类型声明),您的代码可以正常工作。唯一的问题是您要两次致电reader.ReadToEnd(),而且第二次致电是在您明确关闭ResponseStreamStreamReader之后。

第一个电话在第12行,它将目录列表打印到控制台:

Console.WriteLine(reader.ReadToEnd());

第二个调用在第18行,您正在尝试将其返回值转换为变量result

result = reader.ReadToEnd();

但这只是在您同时关闭ResponseStreamStreamReader以后:

reader.Close();
response.Close();
result = reader.ReadToEnd();

所以您甚至会收到一条错误消息,说明您在做什么错了:

  

无法从关闭的TextReader读取。

这是第18行抛出的异常。

即使您将第18行之后的两个调用都移到Close()方法上,也不会起作用,因为第一次调用reader.ReadToEnd()方法会清空读取缓冲区并处理{ {1}}对象,因此在第18行会引发以下异常:

  

无法访问已处置的对象。   对象名称:“ System.Net.Sockets.NetworkStream”。

解决方案

您需要做的是仅调用方法NetworkStream,在关闭reader.ReadToEnd()ResponseStream并将其返回值存储在变量中之前执行此操作。然后,您可以对结果执行任何操作:

StreamReader

工作示例

如果您完全按照建议进行操作,则以下代码必须有效:

  1. 在Visual Studio中创建一个包含控制台应用程序项目的新解决方案,请使用.NET Framework 4.7.2
  2. 将以下代码放入var uriBuilder = new UriBuilder(); uriBuilder.Scheme = "ftp"; uriBuilder.Host = "ftp.myfilepath.com/public/doc"; var request = (FtpWebRequest)WebRequest.Create(uriBuilder.Uri); request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; var response = (FtpWebResponse)request.GetResponse(); var responseStream = response.GetResponseStream(); var reader = new StreamReader(responseStream); var result = reader.ReadToEnd(); Console.WriteLine(result); Console.WriteLine($"Directory List Complete, status {response.StatusDescription}"); reader.Close(); response.Close();

    Program.cs
  3. 运行

  4. 与我们分享它产生的任何潜在错误