C#的HttpWebRequest命令来获取目录列表[关闭](C# HttpWebRequest c

2019-06-18 04:40发布

我需要一个简短的代码片段从HTTP服务器获取一个目录列表。

谢谢

Answer 1:

代码前几个重要的注意事项:

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


Answer 2:

基本的了解:

目录列表是由Web服务器生成的只是HTML页面。 因为有一个Web服务器,列出这些目录没有标准的方式,每个Web服务器生成以自己的方式,这些HTML页面。

得到一个目录列表,最好的方法是简单地做一个HTTP请求的URL,你想上市的目录,并试图分析和提取所有的链接从HTML退还给您。

解析HTML链接,请尝试使用HTML敏捷性包 。

目录浏览:

你想列出目录从必须有目录浏览Web服务器开启,以获得其目录中的文件的此HTML表示。 因此,如果HTTP服务器希望你能你只能得到目录列表。

在HTML敏捷性包的一个简单的例子:

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(FTP喜欢通过SSH)或FTPS(基于SSL的FTP)。

如果什么目录浏览未打开:

如果Web服务器没有目录浏览打开,那么有没有简单的方法来获得目录列表。

你可以在这种情况下,做的最好的是在给定的URL来启动,遵循相同的页面上的所有HTML链接,并尝试建立基于资源对这些HTML页面的相对路径的目录自己的虚拟上市。 这不会给你的是什么文件实际上是在Web服务器上,虽然一个完整列表。



Answer 3:

我只是修改上面,发现了这个最好的

public static class  GetallFilesFromHttp
{
    public static string GetDirectoryListingRegexForUrl(string url)
    {
        if (url.Equals("http://ServerDirPath/"))
        {
            return "\\\"([^\"]*)\\\""; 
        }
        throw new NotSupportedException();
    }
    public static void ListDiractory()
    {
        string url = "http://ServerDirPath/";
        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.ToString());
                        }
                    }
                }
            }
            Console.ReadLine();
        }
    }
}


Answer 4:

感谢伟大的职位。 我下面的模式更好地工作。

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

我还在测试它http://regexhero.net/tester 。

使用它在你的C#代码,你必须在模式中添加更多的反斜杠()任何反斜杠前引号和双引号,因为我

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

nstance,在GetDirectoryListingRegexForUrl方法,你应该使用这样的

返回 “<A HREF = \\” \ S + \\ “>(\ S +?)”;

干杯!



Answer 5:

下面的代码很适合我,当我没有访问FTP服务器:

public static string[] GetFiles(string url)
{
    List<string> files = new List<string>(500);
    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("<a href=\".*\">(?<name>.*)</a>");
            MatchCollection matches = regex.Matches(html);

            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    if (match.Success)
                    {
                        string[] matchData = match.Groups[0].ToString().Split('\"');
                        files.Add(matchData[1]);
                    }
                }
            }
        }
    }
    return files.ToArray();
}

然而,当我做访问FTP服务器,下面的代码工作得更快:

public static string[] getFtpFolderItems(string ftpURL)
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpURL);
    request.Method = WebRequestMethods.Ftp.ListDirectory;

    //You could add Credentials, if needed 
    //request.Credentials = new NetworkCredential("anonymous", "password");

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();

    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);

    return reader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}


Answer 6:

你不能,除非你想要的特定目录启用目录列表,并没有默认文件(通常的index.htm,index.html或default.html中却总是配置)。 只有这样,你有一个目录列表,这通常会用HTML标记并需要解析呈现。



Answer 7:

您也可以设置服务器弥补的WebDAV 。



文章来源: C# HttpWebRequest command to get directory listing [closed]
标签: c# http