我需要一个简短的代码片段从HTTP服务器获取一个目录列表。
谢谢
我需要一个简短的代码片段从HTTP服务器获取一个目录列表。
谢谢
代码前几个重要的注意事项:
我的选择是使用正则表达式。 这允许快速解析和定制。 你可以得到每个站点特定的正则表达式模式,这样你有一个非常模块化的方法。 如果您打算提高解析模块与新网站在不改变源代码,支持使用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();
}
}
}
基本的了解:
目录列表是由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服务器上,虽然一个完整列表。
我只是修改上面,发现了这个最好的
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();
}
}
}
感谢伟大的职位。 我下面的模式更好地工作。
<AHREF=\\"\S+\">(?<name>\S+)</A>
我还在测试它http://regexhero.net/tester 。
使用它在你的C#代码,你必须在模式中添加更多的反斜杠()任何反斜杠前引号和双引号,因为我
<AHREF=\\"\S+\">(?<name>\S+)</A>
nstance,在GetDirectoryListingRegexForUrl方法,你应该使用这样的
返回 “<A HREF = \\” \ S + \\ “>(\ S +?)”;
干杯!
下面的代码很适合我,当我没有访问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);
}
你不能,除非你想要的特定目录启用目录列表,并没有默认文件(通常的index.htm,index.html或default.html中却总是配置)。 只有这样,你有一个目录列表,这通常会用HTML标记并需要解析呈现。
您也可以设置服务器弥补的WebDAV 。