C# 分段文件写入的一个问题
我下载了一个文件的部分(图片),然后我想把这些部分保存到一个文件中 问题是,第一部分被正确下载和保存(我可以看到该部分)。但是,当保存第二部分(FileMode.Append)时,图片似乎被破坏了 代码如下:C# 分段文件写入的一个问题,c#,C#,我下载了一个文件的部分(图片),然后我想把这些部分保存到一个文件中 问题是,第一部分被正确下载和保存(我可以看到该部分)。但是,当保存第二部分(FileMode.Append)时,图片似乎被破坏了 代码如下: HttpWebRequest webRequest; HttpWebResponse webResponse; Stream responseStream; long StartPosition, EndPosition; if (File.Exists(
HttpWebRequest webRequest;
HttpWebResponse webResponse;
Stream responseStream;
long StartPosition, EndPosition;
if (File.Exists(LocalPath))
fileStream = new FileStream(LocalPath, FileMode.Append);
else fileStream = new FileStream(LocalPath, FileMode.Create);
webRequest = (HttpWebRequest)WebRequest.Create(FileURL);
webResponse = (HttpWebResponse)webRequest.GetResponse();
responseStream = webResponse.GetResponseStream();
StartPosition = 0; //download first 52062 bytes of the file
EndPosition = 52061;
webRequest.AddRange(StartPosition, EndPosition);
int SeekPosition = (int)StartPosition;
while ((bytesSize = responseStream.Read(Buffer, 0, Buffer.Length)) > 0)
{
lock (fileStream)
{
fileStream.Seek(SeekPosition, SeekOrigin.Begin);
fileStream.Write(Buffer,0, bytesSize);
}
//the Buffer.Length is 2048.
//When the bytes count to download is < 2048 then I decrease the Buffer.Length
//to prevent downloading more that 52062 bytes.
DownloadedBytesCount += bytesSize;
SeekPosition += bytesSize;
long TotalToDownload = EndPosition - StartPosition;
long bytesLeft = TotalToDownload - DownloadedBytesCount;
if (bytesLeft < Buffer.Length)
Buffer = new byte[bytesLeft];
}
还有一个我在上面描述的问题。为什么文件显示不正确?您不需要
StartPosition
,fileStream.Seek()
和Buffer=new byte[byteslight]代码>
另外,lock()
也不应该是必需的(如果是的话,您会遇到很多麻烦)
所以把所有这些都去掉,因为你很可能弄错了
如果仍然不起作用,编辑问题并提供更多信息。现在缺少的东西很多:
- 您能否使用调试器验证下载循环是否已执行李>
- 如何转换到第二范围52k-104k
- 最终生成的文件有多长
- 文件包含前52k字节还是第二次下载
- 等
所有这些都很重要,我们不必猜测。我会尝试以某种方式下载图像,让您知道它是有效的,然后比较字节结果,以检查文件在哪里被破坏,以及是什么破坏了它…这段代码很糟糕。。。很抱歉,您必须从删除所有代码开始,并从头开始查看您的问题。有很多更好的方法来实现你想要的。看看一些好的解决方案:
什么是“似乎破碎了”?不要使用FileMode.Append。当我在写第二部分后尝试打开该图片时,我看不到它的内容。你的代码太错误了,我甚至不知道从哪里开始。为什么你需要下载文件的一部分呢?“因为我想开发文件下载管理器。这段代码很糟糕。。。很抱歉,您必须从删除所有代码开始,并从头开始查看您的问题。有很多更好的方法来实现你想要的。请看一些好的解决方案:我需要Seek操作和锁,因为本地文件将被许多线程访问。我看到了-奇怪的是-文件的第二部分与第一部分的前4096字节相同。我知道服务器支持范围标头,因为第一部分已正确下载。如果在不同的线程中使用FileStream(不是:文件),则不能使用附加模式。好的,我可以将其更改为FileMode。打开
StartPosition = 52062;
EndPosition = 104122;