gpt4 book ai didi

c# - 下载期间即时计算哈希值

转载 作者:行者123 更新时间:2023-11-30 12:46:24 25 4
gpt4 key购买 nike

我有以下代码可以从 Internet 下载文件并将其保存在某个地方:

class Foo
{
private static Uri _url;
private static string _filepath;
public static void Main(string[] args)
{
_url = new Uri("http://www.speedtest.qsc.de/1MB.qsc");
_filepath = Environment.CurrentDirectory + "/" + Path.GetFileName(_url.LocalPath);
using (var wc = new WebClient())
{
wc.DownloadFileCompleted += _bar;
wc.DownloadFileAsync(_url, _filepath);
}
Console.ReadKey();
}

private static void _bar (object sender, AsyncCompletedEventArgs e)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(_filepath))
{
md5.ComputeHash(stream);
Environment.Exit(0);
}
}
}
}

我想计算文件的 MD5 和 SHA1。我可以通过在下载完成后打开一个 FileStream 并使用它来计算哈希来轻松地做到这一点。但是,至少对于大文件来说,这是非常低效的。

我真正想做的是在下载期间通过在检索到新的字节 block (使用 TransformBlock 方法)后更新哈希来计算它们。

有没有我可以订阅的 WebClient 事件,以获取字节 block 然后更新两个哈希值?我应该使用像 WebRequest 这样的其他类吗?为了显示一些下载进度信息,我也需要读取总字节数。

谢谢!

最佳答案

你可能应该使用 HttpWebRequest为此。

想法是您设置您的请求,然后调用 BeginGetResponse .然后您开始从响应流中读取并存储到文件中。当您收到每个 block 并在将其发送到文件之前,您可以使用数据来计算哈希值。

BeginGetResponse 的 MSDN 页面显示了如何为 HTML 页面执行此操作。您可以稍微更改一下,以二进制而不是文本形式读取数据,而不是将数据附加到 StringBuilder,而是将数据写入文件。

如果您下载的内容足够小,可以轻松地放入内存中,您可以使用 WebClient.DownloadDataAsync ,然后在将其保存到文件之前计算该内存块的哈希值。

关于c# - 下载期间即时计算哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20430734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com