【问题标题】:Ftp List directory - how to get only filenamesFtp List 目录 - 如何仅获取文件名
【发布时间】:2013-08-22 13:31:23
【问题描述】:

我正在为我目前正在编写的一小段代码而苦苦挣扎。该应用程序应该每天运行一次并从 ftp 服务器下载所有文件。我的问题是:

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

  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,代理语句未注释我收到 The remote server returned an error: (550) File unavailable (e.g., file not found, no access). 错误。

我在哪里失败了?

/编辑: 这是列表的屏幕截图,其中应列出所有文件,但保存的是完整的 html 文件:

【问题讨论】:

    标签: c# .net ftpwebrequest


    【解决方案1】:

    我使用HtmlAgilityPack 找到了一个可行的解决方案。

    由于无法更改 html 响应,因此我将 List&lt;string&gt; FtpListing 更改为简单的 string。 使用这个字符串,我解析了 webrequest 提供的 html 代码中的每个 &lt;a&gt; 标签。

    代码:

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

    【讨论】:

      【解决方案2】:

      使用此代码返回某个 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;
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 2020-05-26
        相关资源
        最近更新 更多