从 URI 下载:指定的参数超出有效值的范围
本文关键字:参数 有效值 范围 URI 下载 | 更新日期: 2023-09-27 18:35:46
当我尝试从特定位置下载项目时出现以下异常
public void Mydownload(string uri, string destinationPath, CancellationToken cancellationToken)
{
try
{
WebRequest request = WebRequest.Create(uri);
WebResponse response = request.GetResponse();
using (FileStream file = File.Create(destinationPath))
{
long sz = response.ContentLength;
int bytesRead = 0;
int chunkBytes;
int progress = 0;
byte[] buffer = new byte[4096];
Stream stream = response.GetResponseStream();
while ((chunkBytes = stream.Read(buffer, bytesRead, buffer.Length)) > 0)
{
file.Write(buffer, 0, chunkBytes);
bytesRead += chunkBytes;
int currentProgress = (int)(((double)sz) / bytesRead);
}
}
}
catch(Exception c)
{
Console.Write(c.ToString()); //Specified argument was out of the range of valid values.Parameter name: size
}
}
我注意到程序在语句上的 while 循环的第二次迭代期间崩溃
while ((chunkBytes = stream.Read(buffer, bytesRead, buffer.Length)) > 0)
我不确定我可能做错了什么任何建议?
要stream.Read
的第二个参数是要开始写入的输出缓冲区的偏移量。您正在执行:
stream.Read(buffer, bytesRead, buffer.Length)
然而,bytesRead
在写入数据时递增:
file.Write(buffer, 0, chunkBytes);
bytesRead += chunkBytes;
在第一次迭代中,bytesRead
为 0,因此起始索引在目标缓冲区的范围内,但在第二次迭代中,它可能会在第一次读取后按缓冲区的长度递增。此时,它将是一个超出范围的索引,因此是例外。
您总是希望从缓冲区的开头读取,即
stream.Read(buffer, 0, buffer.Length);