gpt4 book ai didi

c# - 文件未完全下载

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:39 26 4
gpt4 key购买 nike

我正在开发一个从给定 URL 下载视频的应用程序。问题是我没有收到完整的文件内容,因此无法播放文件。例如,尝试下载大小为 ~2.23 MB 的视频,结果只有 ~2.11 MB。当我在浏览器中使用该 URL 时,它会显示一个用于保存视频的对话框,文件已成功下载。

我已经尝试使用 WebClient 类并且它有效,但我想分块下载文件以便能够报告状态(完成百分比)。这是我使用的代码:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
int bufferSize = 1024 * 300;
string filePath = saveFileDialog.FileName;
if (File.Exists(filePath))
File.Delete(filePath);
int totalBytes = 0;
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(DownloadUrl);
long contentLength = webRequest.GetResponse().ContentLength;
using (Stream webStream = webRequest.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(webStream))
using (BinaryWriter fileWriter = new BinaryWriter(File.Create(filePath)))
{
do
{
char[] buffer = new char[bufferSize];
bytesRead = reader.ReadBlock(buffer, 0, bufferSize); // also tried with Read(buffer, 0, bufferSize);
totalBytes += bytesRead;
Console.WriteLine("Bytes read: " + bytesRead + " Total Bytes: " + totalBytes + " Content length: " + contentLength);
if (bytesRead > 0)
fileWriter.Write(buffer, 0, bytesRead);
} while (!reader.EndOfStream);
}
}

我也试过读到 bytesRead = 0,但结果是一样的。有什么我想念的吗?

最佳答案

我建议您使用 DownloadFileAsync反而。这为您提供了两个事件,可以更轻松地跟踪下载进度。

DownloadProgressChangedEventHandler

DownloadFileCompleted

一个非常简单的实现看起来像这样。

WebClient client = new WebClient();

client.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(DownloadProgressCallback);

client.DownloadFileAsync(DownloadUrl, filePath);

然后有一个更新进度条的函数。

private void DownloadProgressCallback(object sender, 
DownloadProgressChangedEventArgs e)
{
myProgressBar.Value = e.ProgressPercentage;
}

您还可以访问 e.BytesReceivede.TotalBytesToReceive 等数据。


编辑:

我必须做的主要更改是将缓冲区从 char[] 更改为 byte[],然后使用 Stream 而不是 StreamReader。

我们还通过检查是否有任何字节要写入我们的硬盘驱动器来检查文件末尾。如果没有剩余可写,我们知道我们已经完成了。

private static void download()
{
int bufferSize = 1024 * 300;
string filePath = "Test.exe";

if (File.Exists(filePath))
File.Delete(filePath);
int totalBytes = 0;
HttpWebRequest webRequest =
(HttpWebRequest)
HttpWebRequest.Create(
@"http://www.rarlab.com/rar/wrar420.exe");
long contentLength = webRequest.GetResponse().ContentLength;
Console.WriteLine(totalBytes);

using (WebResponse webResponse = webRequest.GetResponse())
using (Stream reader = webResponse.GetResponseStream())
using (BinaryWriter fileWriter = new BinaryWriter(File.Create(filePath)))
{
int bytesRead = 0;
byte[] buffer = new byte[bufferSize];
do
{
bytesRead = reader.Read(buffer, 0, buffer.Length);
totalBytes += bytesRead;
fileWriter.Write(buffer, 0, bytesRead);
Console.WriteLine("BytesRead: " + bytesRead + " -- TotalBytes: " + totalBytes);

} while (bytesRead > 0);
}
}

关于c# - 文件未完全下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067035/

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