繁体   English   中英

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

[英]How to get all sub directories under a directory using uribuilder

尝试创建一个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给出的路径下找到的目录。 结果总是空洞的,我不明白为什么或我错过了什么。

问题

忽略一些语法错误(第18和22行上缺少关键字var或类型声明),您的代码正常工作。 唯一的问题是你两次调用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()方法会清空读取缓冲区并处理NetworkStream对象,因此会是第18行抛出的以下异常:

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

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

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();

工作实例

如果您完全按照建议执行所有操作,则必须使用以下代码:

  1. 在包含控制台应用程序项目的Visual Studio中创建新解决方案,使用.NET Framework 4.7.2
  2. 将以下代码放入Program.cs

     using System; using System.IO; using System.Net; namespace FtpDirectoryListing { class Program { static void Main(string[] args) { var uriBuilder = new UriBuilder(); uriBuilder.Scheme = "ftp"; uriBuilder.Host = "speedtest.tele2.net"; 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(); } } } 
  3. 运行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM