我的应用程序使用HttpWebRequest -> WebResponse -> Stream -> FileStream
下载大文件。请参阅下面的代码。
遵循该方案我们总是会损坏文件:
问题:下载的文件已损坏。
我确定这是常见的问题,但我没有谷歌搜索或找到它。请指教。可能是什么原因?
public class Downloader
{
int StartPosition { get; set; }
int EndPosition { get; set; }
bool Cancelling { get; set; }
void Download(string[] args)
{
string uri = @"http://www.example.com/hugefile.zip";
string localFile = @"c:\hugefile.zip";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.AddRange(this.StartPosition);
WebResponse response = request.GetResponse();
Stream inputStream = response.GetResponseStream();
using (FileStream fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Write))
{
int buffSize = 8192;
byte[] buffer = new byte[buffSize];
int readSize;
do
{
// reads the buffer from input stream
readSize = inputStream.Read(buffer, 0, buffSize);
fileStream.Position = this.StartPosition;
fileStream.Write(buffer, 0, (int)readSize);
fileStream.Flush();
// increase the start position
this.StartPosition += readSize;
// check if the stream has reached its end
if (this.EndPosition > 0 && this.StartPosition >= this.EndPosition)
{
this.StartPosition = this.EndPosition;
break;
}
// check if the user have requested to pause the download
if (this.Cancelling)
{
break;
}
}
while (readSize > 0);
}
}
}
答案 0 :(得分:1)
AddRange()调用错误,您想传递一个负值,这样您就可以得到文件的其余部分。来自MSDN Library文章:
如果范围为正,则范围是从数据的开头到范围。
如果范围为负,则范围是从范围到数据的结尾。
我无法看到EndPosition如何被初始化,这也可能是错误的。
答案 1 :(得分:1)
要解决此问题,我建议您进行文件比较以确定差异。下载的是丢失的部分吗?它是否有重复的部分或是否有不正确的部分?