[英]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()
,而且第二次调用就在你明确关闭了ResponseStream
和StreamReader
。
第一个调用是在第12行,它将目录列表打印到控制台:
Console.WriteLine(reader.ReadToEnd());
第二个调用是在第18行,你试图将其返回值转换为变量result
:
result = reader.ReadToEnd();
但就在你关闭了ResponseStream
和StreamReader
:
reader.Close();
response.Close();
result = reader.ReadToEnd();
所以你甚至会收到一条错误信息,说明你做错了什么:
无法从封闭的TextReader中读取。
这是18号线上的一个例外。
即使您在第18行之后将两次调用都移到Close()
方法,它也无法工作,因为第一次调用reader.ReadToEnd()
方法会清空读取缓冲区并处理NetworkStream
对象,因此会是第18行抛出的以下异常:
无法访问已处置的对象。 对象名:'System.Net.Sockets.NetworkStream'。
你需要做的是只调用方法reader.ReadToEnd()
一次,在关闭ResponseStream
和StreamReader
并将其返回值存储在变量中之前执行。 然后,您可以使用结果执行任何操作:
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
:
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(); } } }
运行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.