当前位置:  开发笔记 > 编程语言 > 正文

C#HttpWebRequest命令获取目录列表

如何解决《C#HttpWebRequest命令获取目录列表》经验,为你挑选了2个好方法。

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

谢谢



1> Jorge Ferrei..:

代码之前的一些重要注意事项:

    必须配置HTTP Server以允许列出所需目录的目录;

    因为目录列表是普通的HTML页面,所以没有标准来定义目录列表的格式;

    由于考虑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 "(?.*)";
            }
            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();
        }
    }
}



2> Brian R. Bon..:

基本了解:

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

获取目录列表的最佳方法是简单地对您希望目录列表的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(FTP之类的SSH)或FTPS(基于SSL的FTP).

如果未打开目录浏览,该怎么办:

如果Web服务器没有打开目录浏览,则没有简单的方法来获取目录列表.

在这种情况下,您可以做的最好的事情是从给定的URL开始,遵循同一页面上的所有HTML链接,并尝试根据这些HTML页面上的资源的相对路径自己构建目录的虚拟列表.这不会为您提供Web服务器上实际文件的完整列表.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有