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?

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 demande 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://soffr.miximages.com/c%23/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 requête GET (en ne définissant pas la propriété Method sur "HEAD" ou en utilisant la classe WebClient ).

Si vous voulez simplement copier et 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 (ssortingng 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’il existe, il serait plus efficace d’envoyer une requête GET place en ne définissant pas la propriété Method sur "HEAD" ou en utilisant la classe WebClient .

Voici une version simplifiée du code:

 public bool URLExists(ssortingng 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.), vous feriez mieux d’utiliser WebClient – vous obtiendrez une exception WebException si elle n’existe pas.

 public static bool UrlExists(ssortingng 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(ssortingng 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; } 

Anoter version avec define timeout:

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

WebRequest attendra longtemps (ignorez le jeu d’utilisateur timeout) car vous ne définissez pas le proxy, je change donc pour utiliser RestSharp.

 var client = new RestClient(url); var request = new RestRequest(Method.HEAD); request.Timeout = 5000; var response = client.Execute(request); result = response.StatusCode == HttpStatusCode.OK;