在我的应用程序中,我使用WebClient类通过简单地调用DownloadFile方法从Web服务器下载文件。现在,我需要在下载之前检查某个文件是否存在(或者在我只想确保它存在的情况下)。我有两个问题:
- 如何在尽量减少数据传输的情况下检查服务器上的文件是否存在?(我需要检查相当多的文件)
- 是否有一种方法可以在不下载文件的情况下获取给定远程文件的大小?
提前感谢!
在我的应用程序中,我使用WebClient类通过简单地调用DownloadFile方法从Web服务器下载文件。现在,我需要在下载之前检查某个文件是否存在(或者在我只想确保它存在的情况下)。我有两个问题:
提前感谢!
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);
}
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块中。 希望这能有所帮助!
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();
}
如果有人遇到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);
}