14

HTTP サーバーからディレクトリ リストを取得するには、短いコード スニペットが必要です。

ありがとう

4

7 に答える 7

31

コードの前のいくつかの重要な考慮事項:

  1. HTTPサーバーは、必要なディレクトリのディレクトリリストを許可するように構成する必要があります。
  2. ディレクトリリストは通常​​のHTMLページであるため、ディレクトリリストの形式を定義する標準はありません。
  3. 考慮事項2により、サーバーごとに特定のコードを配置する必要がある土地にいます。

私の選択は正規表現を使用することです。これにより、迅速な解析とカスタマイズが可能になります。サイトごとに特定の正規表現パターンを取得できます。これにより、非常にモジュール化されたアプローチが可能になります。ソースコードを変更せずに新しいサイトサポートで解析モジュールを拡張する場合は、外部ソースを使用してURLを正規表現パターンにマッピングします。

http://www.ibiblio.org/pub/からディレクトリリストを印刷する例

namespace Example
{
    using System;
    using System.Net;
    using System.IO;
    using System.Text.RegularExpressions;

    public class MyExample
    {
        public static string GetDirectoryListingRegexForUrl(string url)
        {
            if (url.Equals("http://www.ibiblio.org/pub/"))
            {
                return "<a href=\".*\">(?<name>.*)</a>";
            }
            throw new NotSupportedException();
        }
        public static void Main(String[] args)
        {
            string url = "http://www.ibiblio.org/pub/";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    string html = reader.ReadToEnd();
                    Regex regex = new Regex(GetDirectoryListingRegexForUrl(url));
                    MatchCollection matches = regex.Matches(html);
                    if (matches.Count > 0)
                    {
                        foreach (Match match in matches)
                        {
                            if (match.Success)
                            {
                                Console.WriteLine(match.Groups["name"]);
                            }
                        }
                    }
                }
            }

            Console.ReadLine();
        }
    }
}
于 2008-09-23T23:20:37.277 に答える
9

基本的な理解:

ディレクトリ リストは、Web サーバーによって生成される単なる HTML ページです。Web サーバーがこれらのディレクトリを一覧表示する標準的な方法がないため、各 Web サーバーは独自の方法でこれらの HTML ページを生成します。

ディレクトリの一覧を取得する最善の方法は、ディレクトリの一覧が必要な URL に対して HTTP 要求を実行し、返された HTML からすべてのリンクを解析して抽出することです。

HTML リンクを解析するには、HTML Agility Packを使用してみてください。

ディレクトリの閲覧:

ディレクトリを一覧表示する Web サーバーでは、ディレクトリ内のファイルのこの HTML 表現を取得するために、ディレクトリ ブラウジングがオンになっている必要があります。そのため、HTTP サーバーが必要とする場合にのみ、ディレクトリ リストを取得できます。

HTML Agility Pack の簡単な例:

HtmlDocument doc = new HtmlDocument();
doc.Load(strURL);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
{
HtmlAttribute att = link"href";
//do something with att.Value;
}

よりクリーンな代替手段:

あなたの状況で可能であれば、よりクリーンな方法は、ファイル転送プロトコル (FTP)、SFTP (SSH 経由のような FTP)、または FTPS (SSL 経由の FTP) など、ディレクトリの一覧表示に意図されたプロトコルを使用することです。

ディレクトリの参照がオンになっていない場合:

Web サーバーでディレクトリ ブラウジングがオンになっていない場合、ディレクトリ リストを取得する簡単な方法はありません。

この場合にできる最善の方法は、特定の URL から開始し、同じページのすべての HTML リンクをたどり、これらの HTML ページ上のリソースの相対パスに基づいてディレクトリの仮想リストを作成することです。ただし、Web サーバー上に実際にあるファイルの完全なリストは表示されません。

于 2008-09-23T23:09:51.983 に答える
2

素晴らしい投稿をありがとう。私にとっては、以下のパターンの方がうまくいきました。

<AHREF=\\"\S+\">(?<name>\S+)</A>

http://regexhero.net/testerでもテストしました。

C# コードで使用するには、i のパターンでバックスラッシュと二重引用符の前にバックスラッシュ () を追加する必要があります。

<AHREF=\\"\S+\">(?<name>\S+)</A>

たとえば、GetDirectoryListingRegexForUrl メソッドでは、次のようなものを使用する必要があります

return "< A HREF=\\"\S+\\">(?\S+)";

乾杯!

于 2013-02-22T19:02:55.207 に答える
0

または、サーバーをWebDAV用に設定することもできます。

于 2008-09-23T23:26:43.177 に答える
0

必要な特定のディレクトリでディレクトリ リストが有効になっていて、既定のファイル (通常は index.htm、index.html、または default.html ですが、常に構成可能) がない場合を除き、できません。その後、通常は HTML でマークアップされ、解析が必要なディレクトリ リストが表示されます。

于 2008-09-23T23:11:14.383 に答える