【发布时间】:2015-01-20 14:19:21
【问题描述】:
使用 C# 从 FTP 服务器获取目录列表。输出格式为 HTML。必需是未格式化的列表(由 Linux ls 命令返回)。 (尽量避免解析 HTML 来获取文件列表。)
观察:
FTP 服务器是客户端运行的 vsftpd。
列出目录时不会出现此问题,例如Filezilla FTP 服务器。
-
获取目录列表时连接到 vsftpd 服务器的 Filezilla 客户端超时
Error: Connection timed out Error: Failed to retrieve directory listing
参考下面的代码,会发生以下行为/错误:
何时 代码中设置的代理服务器 然后 服务器返回 HTML 格式的列表,而不是简单的 ls 输出。
何时 代理服务器设置为 null 或
WebRequest.DefaultWebProxy或GlobalProxySelection.GetEmptyWebProxy()或new WebProxy();然后:The remote server returned an error: (550) File unavailable (e.g., file not found, no access).何时: 代码中未指定代理服务器,并且代理未设置为 null。 然后
The remote server returned an error: (407) Proxy Authentication Required.
问题
- 如何设置 C# 代码以获取 ls 目录列表而不是 HTML? 或
- 是否可以在 vsftpd(服务器)端执行任何操作来阻止 HTML 目录列表?
详情:
代码提取
FtpWebRequest request = WebRequest.Create(uri) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.ListDirectory;
//1. Works but returns HTML
request.Proxy = new WebProxy("http://xxx.xxx.xxx.xxx:8080",true);
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
//2. Does not work
//request.Proxy = null;// WebRequest.DefaultWebProxy;// GlobalProxySelection.GetEmptyWebProxy(); // null; //new WebProxy();
request.Credentials = server.Credential;
request.KeepAlive = true;
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Regex filter = FileUtils.GetRegex(clientSource.FileFilter);
while (!reader.EndOfStream)
{
ProcessFileLine(reader.ReadLine(), filter, files);
}
reader.Close();
response.Close();
HTML 格式的目录列表
<HTML>
<meta http-equiv="Content-Type" content="text-html; charset=UTF-8">
<HEAD>
<TITLE>FTP root at ftp-jhb.saicomvoice.co.za. </TITLE>
</HEAD>
<BODY>
<H1>FTP root at ftp-jhb.saicomvoice.co.za. </H1>
<HR>
<PRE>
12/11/15 04:36PM [GMT] <DIR> <A HREF="/bin/">bin</A>
12/11/15 12:56PM [GMT] <DIR> <A HREF="/boot/">boot</A>
02/22/13 12:00AM [GMT] <DIR> <A HREF="/cgroup/">cgroup</A>
12/11/15 03:36PM [GMT] <DIR> <A HREF="/dev/">dev</A>
01/19/15 01:32PM [GMT] <DIR> <A HREF="/etc/">etc</A>
12/12/15 11:45AM [GMT] <DIR> <A HREF="/home/">home</A>
12/11/15 12:51PM [GMT] <DIR> <A </PRE>
<HR>
</BODY>
</HTML>
【问题讨论】:
-
可能是代理将其格式化为 html。