如何使用C#和WebClient类检查服务器上的文件是否存在

23

在我的应用程序中,我使用WebClient类通过简单地调用DownloadFile方法从Web服务器下载文件。现在,我需要在下载之前检查某个文件是否存在(或者在我只想确保它存在的情况下)。我有两个问题:

  1. 如何在尽量减少数据传输的情况下检查服务器上的文件是否存在?(我需要检查相当多的文件)
  2. 是否有一种方法可以在不下载文件的情况下获取给定远程文件的大小?

提前感谢!


你可能需要修改你的问题标题,以明确表明你正在使用WebClient,并且你的代码并没有直接在Web服务器上运行。 - Tim Robinson
做了。谢谢提示。 - Mats
这是我之前关于这个问题写的<a href="http://blogs.microsoft.co.il/blogs/dorr/archive/2008/09/02/how-to-check-if-a-file-exists-over-http.aspx">博客文章</a>,我把它放在这里以备将来搜索... - Dor Rotman
4个回答

45

WebClient的功能相对有限;如果你切换到使用WebRequest,就可以发送HTTP HEAD请求。当你发出此请求时,应该要么收到一个错误(如果文件不存在),要么得到一个带有有效ContentLength属性的WebResponse

编辑:示例代码:

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

谢谢你的回答!我已经知道可以通过 GetResponse() 方法获取响应,然后检查 ContentLength。但是这样确保整个文件没有下载吗?我找不到发送HTTP HEAD请求的方法。你能指点我一下吗? - Mats
@Matthias 使用 WebRequest.Create(uri) 创建一个 WebRequest,然后将 'Method' 属性设置为 "HEAD"。 - chakrit
查克里特所说的;另外,请参考示例。 - Tim Robinson
编辑使用“using”以避免超时:https://dev59.com/f0vSa4cB1Zd3GeqPcTDY - Jeroen K
有些网站不允许使用“HEAD”方法(例如Amazon.com)。为了解决这个问题,您可以将第一个请求放在try和catch块中,如果出现异常,则捕获它并尝试使用“GET”方法再次请求。虽然我不确定是否还有其他不接受“HEAD”方法的网站,但也许只使用“GET”方法更为合适。 - Arman Bimatov

5
当您使用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块中。 希望这能有所帮助!


0
什么是检查服务器上文件是否存在的最佳方法,而不会在网络中传输太多数据?
您可以使用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(); 
}

0

如果有人遇到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);
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接