在下载仍在运行时,是否有一种简单的方法来处理加载的数据? 我不想等待下载完成以便在处理之前将整个数据放在内存或磁盘上。我想这样做是因为我的数据已被压缩,我想要解压缩运行中的字节数据包然后将它们直接写入磁盘。所以我从不使用比一个下载包更多的内存。
我试图与WebClient类相处,但我没有找到如何访问DownloadProgressChanged事件中最后加载的字节。
这样的事情:
WebClient wc = new WebClient();
Uri uri = new Uri(myURL);
wc.DownloadProgressChanged += wc_DownloadProgressChanged;
wc.DownloadDataAsync(uri);
...
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
ProcessData(e.Bytes,e.BytesReceived); //e.Bytes should access the downloaded byte packet
//but it doesn't exist
}
我认为它已经使用了libcurl,但我想知道在不使用外部库的情况下是否可行。
答案 0 :(得分:0)
没有可能测试它,但它可以像这样工作:
public void DownloadFileAsync()
{
WebClient wc = new WebClient();
Uri uri = new Uri(myURL);
//Open Stream from URI
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(OpenReadCallback);
wc.OpenReadAsync(uri);
}
private static void OpenReadCallback(Object sender, OpenReadCompletedEventArgs e)
{
Stream resStream = null;
try
{
resStream = (Stream)e.Result;
//Your decompression stream Gzip for example
using (GZipStream compressionStream = new GZipStream(resStream, CompressionMode.Decompress))
{
//write gzip stream to file
using (
FileStream outFile = new FileStream(@"c:\mytarget.somefile", FileMode.Create, FileAccess.Write,
FileShare.None))
compressionStream.CopyTo(outFile);
}
}
finally
{
if (resStream != null)
{
resStream.Close();
}
}
}