Подтвердить что ты не робот

Могу ли я проверить, существует ли файл по URL-адресу?

Я знаю, что могу локально, в своей файловой системе, проверить, существует ли файл:

if(File.Exists(path))

Можно ли проверить конкретный удаленный URL?

4b9b3361

Ответ 1

Если вы пытаетесь проверить наличие веб-ресурса, я бы рекомендовал использовать класс HttpWebRequest. Это позволит вам отправить запрос HEAD на указанный URL. Вернутся только заголовки ответов, даже если ресурс существует.

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

Конечно, если вы хотите загрузить ресурс, если он существует, скорее всего, будет более эффективным отправлять запрос GET (не устанавливая свойство Method на "HEAD", либо используя WebClient).

Ответ 2

Если вы хотите просто скопировать и вставить код Justin и получить метод для использования, вот как я его реализовал:

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

Я буду следить за ним:

Если вы хотите загрузить ресурс и он существует, было бы более эффективно отправлять запрос GET, не устанавливая для свойства Method значение "HEAD" или используя класс WebClient.

Ответ 3

Ниже приведена упрощенная версия кода:

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

Ответ 4

Если вы используете путь unc или подключенный диск, это будет работать нормально.

Если вы используете веб-адрес (http, ftp и т.д.), вам лучше использовать WebClient - вы получите WebException если он не существует.

Ответ 5

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

Ответ 6

Моя версия:

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

Ответ 7

Версия Anoter с таймаутом определения:

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