How to check if a file exists on a server using c# and the WebClient class

33,557

Solution 1

WebClient is fairly limited; if you switch to using WebRequest, then you gain the ability to send an HTTP HEAD request. When you issue the request, you should either get an error (if the file is missing), or a WebResponse with a valid ContentLength property.

Edit: Example code:

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

Solution 2

When you request file using the WebClient Class, the 404 Error (File Not Found) will lead to an exception. Best way is to handle that exception and use a flag which can be set to see if the file exists or not.

The example code goes as follows:

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!!!");
}

You can put your code in respective if blocks. Hope it helps!

Share:
33,557

Related videos on Youtube

Mats
Author by

Mats

Updated on July 09, 2022

Comments

  • Mats
    Mats almost 2 years

    In my application I use the WebClient class to download files from a Webserver by simply calling the DownloadFile method. Now I need to check whether a certain file exists prior to downloading it (or in case I just want to make sure that it exists). I've got two questions with that:

    1. What is the best way to check whether a file exists on a server without transfering to much data across the wire? (It's quite a huge number of files I need to check)
    2. Is there a way to get the size of a given remote file without downloading it?

    Thanks in advance!

    • Tim Robinson
      Tim Robinson about 15 years
      You might want to amend your question's title to make clear that you're using WebClient and your code isn't running directly on the web server.
    • Mats
      Mats about 15 years
      Did that. Thanks for the hint.
    • Dor Rotman
      Dor Rotman over 13 years
      Here's a <a href="blogs.microsoft.co.il/blogs/dorr/archive/2008/09/02/… post</a> I wrote regarding this matter in the past. I'm putting it here for future searches...
  • Mats
    Mats about 15 years
    Thanks for your answer! I've seen that I can get a response through the GetResponse() method and then check the ContentLength. But does this make sure the entire file is not downloaded? I can't find a way to send an HTTP HEAD request. Could you point me into the right direction?
  • Tim Robinson
    Tim Robinson about 15 years
    What chakrit said; also, see example.
  • Jeroen K
    Jeroen K about 11 years
    Edited to use 'using' to avoid timeouts stackoverflow.com/questions/2022021/…
  • Arman Bimatov
    Arman Bimatov over 10 years
    Some websites don't allow "HEAD" (Amazon.com for example). To fix this you could surround first request with try and catch, and then if an exception comes up - catch it and try again with the use of "GET" method. Although, I'm not sure, if there are more websites not accepting "HEAD", then maybe it makes sense just to use the "GET" method.