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?
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
.
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 classeWebClient
.
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;
}
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.
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;
}
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;
}
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;
Une autre version avec define timeout:
public bool URLExists(string url,int timeout = 5000)
{
...
webRequest.Timeout = timeout; // miliseconds
...
}