consumir - peticiones c# http request
C#HttpWebRequest comando para obtener la lista de directorios (7)
Necesito un fragmento de código corto para obtener una lista de directorio de un servidor HTTP.
Gracias
Algunas consideraciones importantes antes del código:
- El servidor HTTP debe configurarse para permitir directorios que enumeren los directorios que desea;
- Debido a que los listados de directorios son páginas HTML normales, no existe un estándar que defina el formato de una lista de directorios;
- Debido a la consideración 2, se encuentra en el terreno donde debe colocar un código específico para cada servidor.
Mi elección es usar expresiones regulares. Esto permite un rápido análisis y personalización. Puede obtener un patrón específico de expresiones regulares por sitio y así tener un enfoque muy modular. Utilice una fuente externa para mapear URL a patrones de expresiones regulares si planea mejorar el módulo de análisis con la compatibilidad con nuevos sitios sin cambiar el código fuente.
Ejemplo para imprimir la lista de directorios desde 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();
}
}
}
Alternativamente, puede configurar el servidor para WebDAV .
No puede hacerlo, a menos que el directorio particular que desea tenga habilitada la lista de directorios y no haya ningún archivo predeterminado (generalmente index.htm, index.html o default.html pero siempre configurable). Solo entonces se te presentará una lista de directorios, que generalmente estará marcada con HTML y requerirá un análisis sintáctico.
Gracias por la excelente publicación. para mí, el patrón a continuación funcionó mejor.
<AHREF=//"/S+/">(?<name>/S+)</A>
También lo probé en http://regexhero.net/tester .
para usarlo en tu código C #, debes agregar más barras invertidas () antes de cualquier barra invertida y comillas dobles en el patrón para i
<AHREF=//"/S+/">(?<name>/S+)</A>
nstance, en el método GetDirectoryListingRegexForUrl debe usar algo como esto
return "<A HREF = //" / S + // "> (? / S +)";
¡Aclamaciones!
acabo de modificar arriba y encontré esto mejor
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();
}
}
}
El siguiente código funciona bien para mí cuando no tengo acceso al servidor 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();
}
Sin embargo, cuando tengo acceso al servidor ftp, el siguiente código funciona mucho más rápido:
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);
}
Entendimiento básico:
Las listas de directorios son solo páginas HTML generadas por un servidor web. Cada servidor web genera estas páginas HTML a su manera porque no hay una forma estándar para que un servidor web liste estos directorios.
La mejor forma de obtener una lista de directorios es simplemente hacer una solicitud HTTP a la URL que desea que aparezca en el directorio, y tratar de analizar y extraer todos los enlaces del HTML que se le devuelve.
Para analizar los enlaces HTML, intente utilizar HTML Agility Pack .
Navegación en el directorio:
El servidor web del que desea incluir directorios debe tener activada la exploración de directorios para obtener esta representación HTML de los archivos en sus directorios. Por lo tanto, solo puede obtener la lista de directorios si el servidor HTTP desea que usted pueda.
Un ejemplo rápido del 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;
}
Alternativa más limpia:
Si es posible en su situación, un método más limpio es utilizar un protocolo previsto para listas de directorios, como el Protocolo de transferencia de archivos (FTP), SFTP (FTP como SSH) o FTPS (FTP sobre SSL).
¿Qué ocurre si la exploración de directorios no está activada?
Si el servidor web no tiene activada la exploración de directorios, entonces no hay una manera fácil de obtener la lista de directorios.
Lo mejor que puede hacer en este caso es comenzar en una URL determinada, seguir todos los enlaces HTML en la misma página y tratar de crear una lista virtual de directorios en función de las rutas relativas de los recursos en estas páginas HTML. Sin embargo, esto no le dará una lista completa de qué archivos están realmente en el servidor web.