在C#中,使用HttpWebRequest处理大文件时,需要考虑分块传输和断点续传。以下是一个简单的示例,展示了如何使用HttpWebRequest分块下载大文件:
using System;
using System.IO;
using System.Net;
using System.Text;
class Program
{
static void Main()
{
string url = "https://example.com/largefile.zip"; // 替换为你要下载的大文件的URL
string localFilePath = "largefile.zip"; // 保存到本地的文件名
int bufferSize = 1024 * 1024; // 每次读取的数据块大小,例如1MB
using (WebClient webClient = new WebClient())
{
webClient.DownloadFileCompleted += (sender, e) =>
{
Console.WriteLine("下载完成");
};
webClient.DownloadProgressChanged += (sender, e) =>
{
Console.WriteLine($"下载进度: {e.ProgressPercentage}%");
};
webClient.UseDefaultCredentials = true;
webClient.Headers.Add("Range", $"bytes={0}-"); // 设置分块下载范围
using (Stream fileStream = new FileStream(localFilePath, FileMode.Create, FileAccess.Write))
{
webClient.DownloadFileAsync(new Uri(url), fileStream, bufferSize);
Console.WriteLine("按任意键继续...");
Console.ReadKey();
}
}
}
}
在这个示例中,我们使用了WebClient
类来下载大文件。我们设置了DownloadFileCompleted
和DownloadProgressChanged
事件处理器,以便在下载完成或进度更改时执行相应的操作。
我们使用UseDefaultCredentials
属性设置了默认凭据,以便在需要身份验证的情况下进行下载。我们还使用Headers.Add
方法添加了Range
头,以便将下载范围设置为从0字节开始。这样,浏览器将从文件的第一个字节开始下载,直到遇到Content-Range
响应头为止。
最后,我们使用FileStream
类将下载的数据写入本地文件。我们设置了缓冲区大小,以便一次读取1MB的数据。当用户按下任意键时,下载将停止。