FTP列出目录 - 如何仅获取文件名

3

我正在写一小段代码,遇到了些困难。这个应用程序每天运行一次,需要从FTP服务器下载所有文件。我的问题是:

虽然从理论上讲,列出目录内容的例程运行良好,检查所有文件并将它们保存到列表中,但实际上有两个错误:

  1. 列表以HTML格式呈现
  2. 我只需要文件名和扩展名

代码

string localPath = System.Reflection.Assembly.GetExecutingAssembly().Location;    
List<string> FtpListing = new List<string>();
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Properties.Settings.Default.FtpUrl);
//request.Proxy = GlobalProxySelection.GetEmptyWebProxy();
request.Credentials = new NetworkCredential(Properties.Settings.Default.FtpUsername, Properties.Settings.Default.FtpPassword);
request.Method = WebRequestMethods.Ftp.ListDirectory;
using (StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream()))
{
    string fileName = streamReader.ReadLine();
    while (fileName != null)
    {
         FtpListing.Add(fileName);
         fileName = streamReader.ReadLine();
    }
}

没有代理的情况下,返回html;当取消代理语句时,我得到了一个"远程服务器返回错误:(550)文件不可用(例如,文件未找到,无访问权限)"的错误。 我在哪里错了? /编辑:这是列表的截图,所有文件应该被列出,但是却保存了完整的html文件。
2个回答

0

我发现通过使用HtmlAgilityPack找到了一个有效的解决方案。

由于我无法更改HTML响应,我将我的 List<string> FtpListing 更改为简单的string。 使用这个字符串,我解析了网页请求提供的html代码中的每个<a>标签。

代码:

string HtmlResult = String.Empty;
Console.WriteLine("Starting listing of files....");
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Properties.Settings.Default.FtpUrl);
request.Credentials = new NetworkCredential(Properties.Settings.Default.FtpUsername, Properties.Settings.Default.FtpPassword);
request.UsePassive = false;
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
using (Stream responsestream = response.GetResponseStream())
{
    using (StreamReader reader = new StreamReader(responsestream))
    {
        string _line = reader.ReadLine();
        while (_line != null && _line != String.Empty)
        {
            HtmlResult += _line;
            _line = reader.ReadLine();
        }
    }                    
}
//parse html output
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(HtmlResult);
foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//a[@href]"))
{
    if(node.InnerText.Contains(".txt")) FtpListing.Add(node.InnerText);
}
Console.WriteLine("{0} Files found", FtpListing.Count);

0
使用此代码返回特定FTP目录中文件名列表。
    System.Net.FtpWebRequest ftpRequest =    System.Net.FtpWebRequest)System.Net.WebRequest.Create(SourceDirectory);
            ftpRequest.Credentials = new System.Net.NetworkCredential(SourceFTPUserName, SourceFTPPassword);
               ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
              System.Net.FtpWebResponse response =        (System.Net.FtpWebResponse)ftpRequest.GetResponse();
        System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream());

        List<string> directories = new List<string>();

        string line = streamReader.ReadLine();
        while (!string.IsNullOrEmpty(line))
        {
            directories.Add(line);
            line = streamReader.ReadLine();
        }

        streamReader.Close();
        return directories;

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接