当前位置:  开发笔记 > 编程语言 > 正文

如何使用进度回调将文件下载到字符串中?

如何解决《如何使用进度回调将文件下载到字符串中?》经验,为你挑选了0个好方法。

我想使用WebClient(或者还有另一个更好的选择?)但是有一个问题.我知道打开流需要一些时间,这是无法避免的.然而,与完全立即阅读相比,阅读它需要更多的时间.

有没有最好的方法来做到这一点?我的意思是两种方式,字符串和文件.Progress是我自己的代表,它运作良好.


第五次更新:

最后,我设法做到了.与此同时,我查看了一些让我意识到问题出在其他地方的解决方案.

我已经测试了自定义WebResponseWebRequest对象,库libCURL.NET甚至Sockets.

时间的差异是gzip压缩.压缩流长度只是普通流长度的一半,因此浏览器的下载时间不到3秒.

如果有人想知道我是如何解决这个问题,我会放一些代码:(不需要一些标题)

public static string DownloadString(string URL)
    {
        WebClient client = new WebClient();
        client.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1045 Safari/532.5";
        client.Headers["Accept"] = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        client.Headers["Accept-Encoding"] = "gzip,deflate,sdch";
        client.Headers["Accept-Charset"] = "ISO-8859-2,utf-8;q=0.7,*;q=0.3";

        Stream inputStream = client.OpenRead(new Uri(URL));
        MemoryStream memoryStream = new MemoryStream();
        const int size = 32 * 4096;
        byte[] buffer = new byte[size];

        if (client.ResponseHeaders["Content-Encoding"] == "gzip")
        {
            inputStream = new GZipStream(inputStream, CompressionMode.Decompress);
        }

        int count = 0;
        do
        {
            count = inputStream.Read(buffer, 0, size);
            if (count > 0)
            {
                memoryStream.Write(buffer, 0, count);
            }
        }
        while (count > 0); 

        string result = Encoding.Default.GetString(memoryStream.ToArray());
        memoryStream.Close();
        inputStream.Close();
        return result;
    }

我认为asyncro功能几乎是一样的.但我将简单地使用另一个线程来激活此功能.我不需要percise进度指示.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有