【问题标题】:DownloadFile from the Internet?从网上下载文件?
【发布时间】:2010-11-06 13:58:10
【问题描述】:

我对下面的代码块感到困惑,因为它为什么下载网页的内容而不是文件本身。我创建了一个包含一些文本的虚拟文件然后我下载了它,但是当我打开下载文件时,我没有看到我写的任何文本,但它有奇怪的网络语言标签。

    private bool DownloadCSVfile()
    {
        bool downloadOk = false;
        WebClient client = null;

        try
        {
            client = new WebClient();
            client.Credentials = CredentialCache.DefaultCredentials;
            client.DownloadFile(myURL, CSVfile);

            if (File.Exists(CSVfile))
                downloadOk = true;
            else
                downloadOk = false;
        }
        catch (Exception error)
        {
            downloadOk = false;
            string err = error.Message;
        }

        //release resource
        if (client != null)
        {
            client.Dispose();
            client = null;
        }

        //
        if (downloadOk == true)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

【问题讨论】:

    标签: c# downloadfile


    【解决方案1】:

    我猜myURL 以“/”而不是“.csv”结尾,对吗?您是否认为myURL + CSVFile 将包含文件的完整路径?它不会。 (See doc) URL 必须是文件本身的路径。你可以有这样的东西:

    client.DownloadFile(@"./file.csv", "filename.txt");
    

    如果我没有走上正轨,请说出 URL 中的内容以及下载文件中前几个标签的内容。

    【讨论】:

    • 是的,myURL以“/”结尾,文件名在DownloadFile()的第二个参数中。
    • 在 myURL 中的 '/' 后面添加文件名。
    • 这里是下载文件中的标签:
    • 真的,我必须在“/”之后添加我的文件名,所以应该是这样的:client.DownloadFile(myURL + CSVfile, CSVfile);
    • 是的。第一个参数必须指定文件的位置,而不仅仅是文件所在的目录,就像您在问题中所拥有的那样。
    【解决方案2】:

    该网站是否需要登录并且它真的会重定向您?

    在此之前,我有一个需要我伪造我的浏览动作(并存储 cookie 等),然后才能下载我需要的文件。

    【讨论】:

    • 是的,该网站需要登录。因此,在我使用我的 ID 和密码登录后,我只需手动上传文件并运行代码。我也尝试删除文件,然后运行代码,但它仍然下载网页内容。
    • 那么你有什么建议让我解决这个问题吗?
    • 请提供有关 myURL 指向的内容以及您实际收到的“网页内容”的更多信息。
    【解决方案3】:

    对不起,“网页的内容”中的“网页”是什么意思。这里只涉及一个 URL,即 myURL。 myURL 是否直接指向 CSV 文件?如果是这样,那么您收到的内容实际上是什么样的?

    还有:

    if (File.Exists(CSVfile))
        downloadOk = true;
    else
        downloadOk = false;
    

    ...很尴尬。请写:

    downloadOk = File.Exists(CSVfile);
    

    这具有相同的结果,在 1 行而不是 4 行中。

    //
    if (downloadOk == true)
    {
        return true;
    }
    else
    {
        return false;
    }
    

    那就更糟了。单行:

    return downloadOk;
    

    ...在 1 行代码而不是 7 行代码中执行完全相同的操作。

    此外,您的异常块中的两行...

    catch (Exception error)
    {
        downloadOk = false;
        string err = error.Message;
    }
    

    ...什么也不做。 downloadOk 在您的异常块中将始终为 false,并且局部变量“err”在超出范围之前从未使用过。

    【讨论】:

    • 感谢您指出这一点,但我希望清晰易读。
    • 下载文件后,打开下载文件,我看到一堆网页标签,所以可能不是实际的网页内容,而是一堆我看不懂的标签。它喜欢html标签或其他东西。是的,myURL 实际上指向了我的 CSV 文件的位置。例如,DownloadFile(@"myURL", "dummy.csv")
    • 局部变量err,我只是通过它来调试时查看错误消息的类型,因为我不想在消息框中显示异常错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2014-10-14
    相关资源
    最近更新 更多