3

現在書いている小さなコードに苦労しています。アプリケーションは 1 日に 1 回実行され、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).エラーが発生します。

ここで私はどこに失敗していますか?

/edit: これはリストのスクリーンショットです。ここにはすべてのファイルがリストされているはずですが、代わりに完全な html ファイルが保存されています。

Ftpレスポンス

4

2 に答える 2

0

HtmlAgilityPackを使用して、実用的なソリューションを見つけました。

html レスポンスは変更できないのでList<string> FtpListing、単純な .html に変更しましたstring。この文字列を使用<a>して、webrequest によって提供された html コード内のすべてのタグを解析しました。

コード:

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);
于 2013-08-23T09:54:37.390 に答える
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;

それが役に立てば幸い。

于 2014-12-11T13:50:45.740 に答える