C# 在WebClient.DownloadFile之前检查文件是否存在

C# 在WebClient.DownloadFile之前检查文件是否存在,c#,web,webclient,C#,Web,Webclient,我想知道如何在下载之前检查文件是否存在 当前代码: string url = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/text.txt"; string path = "asdf.wix.com/text.txt"; using (var client = new WebClient()) { client.DownloadFile(url, path); } 代码可以工作,但如果站点上缺少该文

我想知道如何在下载之前检查文件是否存在

当前代码:

string url = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/text.txt";
string path = "asdf.wix.com/text.txt";

using (var client = new WebClient())
{
    client.DownloadFile(url, path);
}
代码可以工作,但如果站点上缺少该文件,则会创建一个空text.txt,从而导致问题


有什么想法吗?谢谢大家!

如果url变量指向电脑上的某个位置,则可以使用System.IO.File.Exists检查是否存在:

if(!System.IO.File.Exists(url))
{
    //code that handles the file dne case.. maybe log and return?
}
如果它指向一个遥远的地方,那么我真的不知道如何事先检查它的存在

但是,您可以处理WebClient返回的404案例并删除错误的text.txt文件

using (var client = new WebClient())
{
    try
    {
        client.DownloadFile(url, path);
    }
    catch (WebException e)
    {
        var statusCode = ((HttpWebResponse) e.Response).StatusCode;

        if (statusCode == HttpStatusCode.NotFound && System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
            //maybe log the occurence as well
        }
    }
}

如果需要特定行为,请考虑使用
HttpWebRequest
而不是
WebClient
<代码>网络客户端执行大量的“automagic”


使用这种方法,您可以控制何时创建下载的文件,也就是在开始下载之后。如果服务器上不存在该文件,则在创建该文件之前会出错。在创建
FileStream
之前,您可以添加额外的错误检查,例如检查预期的内容类型等。

因此,类似于写入随机目录,然后验证字节是否大于0,然后再验证文件。移动(随机目录,路径)或您是否有更好的方法我感觉这很容易出错。我已经更新了我的答案,告诉我在你的情况下该怎么做。谢谢,很好。我花了一分钟的时间来弄清楚如何在写入后关闭该文件,但我现在得到了它。如果该文件不存在,此代码将抛出异常。您可以捕获并忽略该异常。或者,您可以通过两个步骤来完成。在第一步中,使用与上面相同的代码,但不调用GetResponseStream(),并使用HEAD作为请求方法。如果文件存在,则返回200。它还将返回内容长度标题。您可以在下载之前检查200状态和conent length>200以确保文件存在。
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = request.GetResponse()) {
    using (var responseStream = response.GetResponseStream()) {   
        using (var fileToDownload = new System.IO.FileStream(path,  System.IO.FileMode.Create,  System.IO.FileAccess.ReadWrite)) {
            responseStream.CopyTo(fileToDownload);
        }
    }
}