2009-12-30 23 views
38

Sé que puedo localmente, en mi sistema de archivos, comprobar si existe un archivo:¿Puedo verificar si existe un archivo en una URL?

if(File.Exists(path)) 

¿Puedo comprobar en una URL remota en particular?

+0

Ver también aquí para mezclar WebClient y HEAD en una sola respuesta: http://stackoverflow.com/questions/153451#156750 –

+0

Marc, ¿por qué usar una clase personalizada sería mejor en este caso? [Más tarde] (http://stackoverflow.com/a/924682/274502) incluso sugieres usar 'try' /' catch'. – cregox

Respuesta

68

Si está intentando verificar la existencia de un recurso web, recomendaría utilizar la clase HttpWebRequest. Esto le permitirá enviar una solicitud HEAD a la URL en cuestión. Solo se devolverán los encabezados de respuesta, incluso si el recurso existe.

var url = "http://www.domain.com/image.png"; 
HttpWebResponse response = null; 
var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "HEAD"; 


try 
{ 
    response = (HttpWebResponse)request.GetResponse(); 
} 
catch (WebException ex) 
{ 
    /* A WebException will be thrown if the status of the response is not `200 OK` */ 
} 
finally 
{ 
    // Don't forget to close your response. 
    if (response != null) 
    { 
     response.Close(); 
    } 
} 

Por supuesto, si desea descargar el recurso si existe sería más probable es que sea más eficiente para enviar una petición GET lugar (si no se establece la propiedad Method a "HEAD", o mediante el uso de la clase WebClient) .

+10

Yo recomendaría buscar un código de error 404 en vez de solo uno. Si es un 500, por ejemplo, puede ser que exista el "archivo", pero que el servidor encontró (quizás un error temporal) al realizar el mantenimiento de la solicitud. Para verificar 404s, asegúrese de convertir 'ex.Response' a' HttpWebResponse', y luego puede comparar 'StatusCode' con' HttpStatusCode.NotFound'. –

3

Si está utilizando una ruta de acceso unc o una unidad asignada, esto funcionará bien.

Si está utilizando una dirección web (http, ftp, etc.), es mejor que use WebClient - obtendrá una WebException si no existe.

12

Si desea copiar sólo & pasta de código Justin 's y obtener un método para usar, así es como he implementado que:

using System.Net; 

public class MyClass { 
    static public bool URLExists (string url) { 
     bool result = false; 

     WebRequest webRequest = WebRequest.Create(url); 
     webRequest.Timeout = 1200; // miliseconds 
     webRequest.Method = "HEAD"; 

     HttpWebResponse response = null; 

     try { 
      response = (HttpWebResponse)webRequest.GetResponse(); 
      result = true; 
     } catch (WebException webException) { 
      Debug.Log(url +" doesn't exist: "+ webException.Message); 
     } finally { 
      if (response != null) { 
       response.Close(); 
      } 
     } 

     return result; 
    } 
} 

Voy a mantener su observación:

Si desea descargar el recurso, y existe, sería más eficiente enviar una solicitud GET en su lugar al no establecer la propiedad Method en "HEAD" o mediante el WebClient clase.

+2

No olvide cerrar la respuesta. – MrDustpan

+0

Tienes razón, @MrDustpan. Pero me pregunto si aún debemos cerrarlo ya que nunca lo hemos asignado a ningún lado ... – cregox

+0

No estoy de acuerdo con el cierre de la respuesta, ya que cuando el objeto se elimina también se cierra (compárelo https://referencesource.microsoft.com/# System/net/System/Net/WebResponse.cs, 95). – cassiodoroVicinetti

8

A continuación se muestra una versión simplificada del código:

public bool URLExists(string url) 
{ 
    bool result = true; 

    WebRequest webRequest = WebRequest.Create(url); 
    webRequest.Timeout = 1200; // miliseconds 
    webRequest.Method = "HEAD"; 

    try 
    { 
     webRequest.GetResponse(); 
    } 
    catch 
    { 
     result = false; 
    } 

    return result; 
} 
0

versión Anoter con definir el tiempo de espera:

public bool URLExists(string url,int timeout = 5000) 
{ 
    ... 
    webRequest.Timeout = timeout; // miliseconds 
    ... 
} 
2
public static bool UrlExists(string file) 
    { 
     bool exists = false; 
     HttpWebResponse response = null; 
     var request = (HttpWebRequest)WebRequest.Create(file); 
     request.Method = "HEAD"; 
     request.Timeout = 5000; // milliseconds 
     request.AllowAutoRedirect = false; 

     try 
     { 
      response = (HttpWebResponse)request.GetResponse(); 
      exists = response.StatusCode == HttpStatusCode.OK; 
     } 
     catch 
     { 
      exists = false; 
     } 
     finally 
     { 
      // close your response. 
      if (response != null) 
       response.Close(); 
     } 
     return exists; 
    } 
+0

Le permite comprobar la página web o cualquier archivo ubicado en un servidor web.Incluso si intenta redirigir a una página 404. – LastEnd

1

Mi versión:

public bool IsUrlExist(string url, int timeOutMs = 1000) 
    { 
     WebRequest webRequest = WebRequest.Create(url); 
     webRequest.Method = "HEAD"; 
     webRequest.Timeout = timeOut; 

     try 
     { 
      var response = webRequest.GetResponse(); 
      /* response is `200 OK` */ 
      response.Close(); 
     } 
     catch 
     { 
      /* Any other response */ 
      return false; 
     } 

     return true; 
    } 
Cuestiones relacionadas