web-dev-qa-db-fra.com

puis-je vérifier si un fichier existe à une URL?

Je sais que je peux localement, sur mon système de fichiers, vérifier si un fichier existe:

if(File.Exists(path))

Puis-je vérifier à une URL distante particulière?

43
mrblah

Si vous essayez de vérifier l'existence d'une ressource Web, je vous recommande d'utiliser la classe HttpWebRequest. Cela vous permettra d’envoyer une requête HEAD à l’URL en question. Seuls les en-têtes de réponse seront renvoyés, même si la ressource 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();
    }
}

Bien sûr, si vous souhaitez télécharger la ressource si elle existe, il serait probablement plus efficace d'envoyer une demande GET à la place (en ne définissant pas la propriété Method à "HEAD" ou en utilisant la classe WebClient.

77
Justin Rusbatch

Si vous voulez simplement copier/coller le code de Justin et obtenir une méthode à utiliser, voici comment je l'ai implémenté:

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

Je vais garder son observation:

Si vous souhaitez télécharger la ressource et qu'elle existe, il serait plus efficace d'envoyer une demande GET en ne définissant pas la propriété Method sur "HEAD" ou en utilisant la classe WebClient.

16
cregox

Vous trouverez ci-dessous une version simplifiée du code:

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;
}
9
Kavit Trivedi

Si vous utilisez un chemin unc ou un lecteur mappé, cela fonctionnera correctement.

Si vous utilisez une adresse Web (http, ftp, etc.), il vaut mieux utiliser WebClient - vous obtiendrez une exception WebException si elle n'existe pas.

3
Oded
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;
    }
2
LastEnd

Ma version:

    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;
    }
1
Andrew

WebRequest attendra longtemps (ignorez le délai défini par l'utilisateur), car le proxy n'est pas défini, je modifie donc l'utilisation de RestSharp pour ce faire.

var client = new RestClient(url);
var request = new RestRequest(Method.HEAD);

 request.Timeout = 5000;
 var response = client.Execute(request);
 result = response.StatusCode == HttpStatusCode.OK;
0
nap

Une autre version avec define timeout:

public bool URLExists(string url,int timeout = 5000)
{
    ...
    webRequest.Timeout = timeout; // miliseconds
    ...
}
0
azouin