c# – 使用读取和写入流来保存文件时损坏的图像
程序员大家好
我正在使用Xamarin(iOS)在应用程序中实现下载功能,以获得正在下载的文件的进度. 我使用的代码是来自网络各处的各种示例,显示相同的主体,编码风格的最大区别.它们都在System.IO.File上使用相同的ReadAsync和WriteAsync函数,并使用字节数组作为缓冲区. 但无论我转向什么样的例子,它都会导致图片上出现不同的文物,如下所示: (原始/下载) 我似乎无法找到任何理由发生这种情况. 在调试不同的东西时,我找到了“避免”这种情况发生的“方法”,但这包括在WriteAsync刚完成后立即添加一个任务延迟,持续20毫秒(在代码中注释掉) – 不是我想要的解决方案有,但告诉问题可能在于两个流的使用(据我所知,’仅限’基本用法’). 希望有人能告诉我这里做错了什么,以及为什么. 提前致谢 public async Task<bool> MakeDownloadRequestAsync(string url,string destination,Action<string,long,float> progress = null) { if (_downloadHttpClient == null) { _downloadHttpClient = new HttpClient (new NativeMessageHandler()); } bool finished = false; try { var result = await _downloadHttpClient.GetAsync(url,HttpCompletionOption.ResponseHeadersRead); long receivedBytes = 0; long totalBytes = result.Content.Headers.ContentLength.HasValue ? result.Content.Headers.ContentLength.Value : 0; System.Diagnostics.Debug.WriteLine ("Started download file: {0}",url); using (var stream = await _downloadHttpClient.GetStreamAsync (url)) { byte[] buffer = new byte[4096]; var filename = Path.GetFileName (url); var writeStream = _fileStore.OpenWrite (Path.Combine(destination,filename)); while(true) { int bytesRead = await stream.ReadAsync(buffer,buffer.Length); if (bytesRead == 0) { finished = true; System.Diagnostics.Debug.WriteLine ("Finished downloading file: {0}",url); break; } await writeStream.WriteAsync(buffer,buffer.Length); //Task.Delay(20); receivedBytes += bytesRead; if (progress != null) { progress.Invoke(url,receivedBytes,totalBytes,(float)receivedBytes/(float)totalBytes); } } writeStream.Dispose(); stream.Dispose(); } } catch (Exception e) { System.Diagnostics.Debug.WriteLine (e); } return finished; } 解决方法
你的问题可能就是这一行:
await writeStream.WriteAsync(buffer,buffer.Length); 它应该是: await writeStream.WriteAsync(buffer,bytesRead); 您的代码正在编写整个缓冲区…无论实际读取的字节数是多少.相反,您应该只写入实际读取的字节数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |