从 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)

不确定我可能做错了什么任何建议?

从 URI 下载:指定的参数超出有效值的范围

stream.Read的第二个参数是要开始写入的输出缓冲区的偏移量。您正在执行:

stream.Read(buffer, bytesRead, buffer.Length)

然而,bytesRead在写入数据时递增:

file.Write(buffer, 0, chunkBytes);
bytesRead += chunkBytes;

在第一次迭代中,bytesRead为 0,因此起始索引在目标缓冲区的范围内,但在第二次迭代中,它可能会在第一次读取后按缓冲区的长度递增。此时,它将是一个超出范围的索引,因此是例外。

您总是希望从缓冲区的开头读取,即

stream.Read(buffer, 0, buffer.Length);