【问题标题】:Check file existence before WebClient.DownloadFile [duplicate]在 WebClient.DownloadFile 之前检查文件是否存在 [重复]
【发布时间】:2018-02-20 07:11:27
【问题描述】:

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

当前代码:

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,从而导致问题。

有什么想法吗?谢谢!

【问题讨论】:

    标签: c# web webclient


    【解决方案1】:

    如果 url 变量指向 PC 上的某个位置,那么您可以使用 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
            }
        }
    }
    

    【讨论】:

    • 所以像写入随机目录然后验证字节 > 0 然后 File.move(randomdirectory, path) 或者你有更好的方法
    • 我感觉这很容易出错。我已经更新了我会在你的情况下做什么的答案。
    【解决方案2】:

    如果您需要特定的行为,请考虑使用HttpWebRequest 而不是WebClientWebClient 做了很多“自动”。

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

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

    【讨论】:

    • 感谢工作正常,我花了几分钟才弄清楚如何在写入后关闭文件,但我现在明白了
    • 如果文件不存在,这段代码会抛出异常。您可以捕获并忽略该异常。
    • 或者,您可以分两步完成。第一步,使用与上面相同的代码,但不调用 GetResponseStream(),并使用 HEAD 作为请求方法。如果文件存在,这将返回 200。它还将返回一个内容长度标头。您可以在下载前检查 200 状态和 conent-length > 200 以确保文件存在。
    猜你喜欢
    • 2015-11-22
    • 2017-09-15
    • 2015-02-21
    • 2019-03-07
    • 2012-11-07
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多