尝试创建一个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
给定的路径下找到的目录。结果总是空白,我不明白为什么或缺少什么。
答案 0 :(得分:0)
忽略一些语法错误(缺少关键字var
或第18和22行的类型声明),您的代码可以正常工作。唯一的问题是您要两次致电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()
方法会清空读取缓冲区并处理{ {1}}对象,因此在第18行会引发以下异常:
无法访问已处置的对象。 对象名称:“ System.Net.Sockets.NetworkStream”。
您需要做的是仅调用方法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
运行