Как проверить, существует ли файл на сервере, используя С# и класс WebClient

В своем приложении я использую класс WebClient для загрузки файлов с веб-сервера, просто вызывая метод DownloadFile. Теперь мне нужно проверить, существует ли определенный файл перед его загрузкой (или в случае, если я просто хочу убедиться, что он существует). У меня есть два вопроса в связи с этим:

  1. Как лучше всего проверить, существует ли файл на сервере, не передавая много данных по сети? (Мне нужно проверить довольно большое количество файлов)
  2. Есть ли способ получить размер данного удаленного файла без его загрузки?

Заранее спасибо!


person Mats    schedule 06.05.2009    source источник
comment
Возможно, вы захотите изменить заголовок своего вопроса, чтобы было ясно, что вы используете WebClient и ваш код не выполняется непосредственно на веб-сервере.   -  person Tim Robinson    schedule 06.05.2009
comment
Сделал это. Спасибо за подсказку.   -  person Mats    schedule 06.05.2009
comment
Вот ‹a href=blogs.microsoft.co.il/blogs/dorr/archive/2008/09/02/ post‹/a› Я писал по этому поводу в мимо. Я кладу его сюда для будущих поисков...   -  person Dor Rotman    schedule 25.08.2010


Ответы (4)


WebClient довольно ограничен; если вы переключитесь на использование WebRequest, вы получите возможность отправлять HTTP-запрос HEAD. При отправке запроса вы должны получить либо ошибку (если файл отсутствует), либо WebResponse с допустимым свойством ContentLength.

Изменить: Пример кода:

WebRequest request = WebRequest.Create(new Uri("http://www.example.com/"));
request.Method = "HEAD";

using(WebResponse response = request.GetResponse()) {
   Console.WriteLine("{0} {1}", response.ContentLength, response.ContentType);
}
person Tim Robinson    schedule 06.05.2009
comment
Спасибо за Ваш ответ! Я видел, что могу получить ответ с помощью метода GetResponse(), а затем проверить ContentLength. Но гарантирует ли это, что весь файл не будет загружен? Я не могу найти способ отправить запрос HTTP HEAD. Не могли бы вы указать мне правильное направление? - person Mats; 06.05.2009
comment
@Matthias Создайте WebRequest с помощью WebRequest.Create(uri), а затем установите для свойства «Метод» значение HEAD. - person chakrit; 06.05.2009
comment
Что сказал чакрит; также см. пример. - person Tim Robinson; 06.05.2009
comment
Отредактировано для использования «using», чтобы избежать тайм-аутов .com/questions/2022021/ - person Jeroen K; 12.04.2013
comment
Некоторые веб-сайты не поддерживают HEAD (например, Amazon.com). Чтобы исправить это, вы можете окружить первый запрос с помощью try и catch, а затем, если возникнет исключение, перехватить его и повторить попытку с использованием метода GET. Хотя, я не уверен, что если есть больше сайтов, не принимающих HEAD, то, возможно, имеет смысл просто использовать метод GET. - person Arman Bimatov; 14.10.2013

Когда вы запрашиваете файл с помощью класса WebClient, ошибка 404 (файл не найден) приведет к исключению. Лучший способ - обработать это исключение и использовать флаг, который можно установить, чтобы увидеть, существует ли файл или нет.

Пример кода выглядит следующим образом:

System.Net.HttpWebRequest request = null;
System.Net.HttpWebResponse response = null;
request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("www.example.com/somepath");
request.Timeout = 30000;
try
{
    response = (System.Net.HttpWebResponse)request.GetResponse();
    flag = 1;
}
catch 
{
    flag = -1;
}

if (flag==1)
{
    Console.WriteLine("File Found!!!");
}
else
{
    Console.WriteLine("File Not Found!!!");
}

Вы можете поместить свой код в соответствующие блоки if. Надеюсь, поможет!

person Code    schedule 05.03.2014

Как лучше всего проверить, существует ли файл на сервере, не передавая много данных по сети?

Вы можете проверить с помощью WebClient.OpenRead, чтобы открыть файловый поток, не читая все байты файла:

using (var client = new WebClient()) 
{
    Stream stream = client.OpenRead(url); 
    // ^ throws System.Net.WebException: 'Could not find file...' if file is not present
    stream.Close(); 
}

Это укажет, существует ли файл в удаленном месте или нет.

Чтобы полностью прочитать файловый поток, вы должны сделать:

using (var client = new WebClient()) 
{
    Stream stream = client.OpenRead(url); 
    StreamReader sr = new StreamReader(stream);
    Console.WriteLine(sr.ReadToEnd());
    stream.Close(); 
}
person SNag    schedule 27.05.2021

На случай, если кто-то застрял с проблемой ssl-сертификата

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback
                                                                            (
                                                                               delegate { return true; }
                                                                            );
            WebRequest request = WebRequest.Create(new Uri("http://.com/flower.zip"));
            request.Method = "HEAD";

            using (WebResponse response = request.GetResponse())
            {
                Console.WriteLine("{0} {1}", response.ContentLength, response.ContentType);
            }
person Arun Prasad E S    schedule 17.07.2021