C# 使用Box.V2 API,DownloadStreamAsync调用会导致文件损坏
我正在开发一个小程序,从Box.com帐户中提取一个文件。使用Box C#SDK,我有以下代码:C# 使用Box.V2 API,DownloadStreamAsync调用会导致文件损坏,c#,windows,box-api,C#,Windows,Box Api,我正在开发一个小程序,从Box.com帐户中提取一个文件。使用Box C#SDK,我有以下代码: BoxFile file = await Client.FilesManager.GetInformationAsync(item.Id); byte[] bytes = new byte[file.Size.Value]; using (FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create, System.I
BoxFile file = await Client.FilesManager.GetInformationAsync(item.Id);
byte[] bytes = new byte[file.Size.Value];
using (FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create, System.IO.FileAccess.Write))
using (Stream stream = await Client.FilesManager.DownloadStreamAsync(file.Id))
{
stream.Read(bytes, 0, (int)file.Size.Value);
fileStream.Write(bytes, 0, bytes.Length);
}
但是,当我尝试提取图像时,生成的文件是具有正确宽度和高度的图像,但只有顶部切片具有像素数据。图像的其余部分为黑色。文件大小正确
如果我拉一个docx或pptx文件并在Word或PowerPoint中打开它们,我会收到一条损坏的文件消息。文件大小正确
如果该文件是一个简单的txt文件,那么它似乎是成功的
我做错了什么?当数据从服务器返回时,
流将使内容分块可用。单个stream.Read
调用仅获取第一个块,这就是为什么图像的顶部部分看起来正确,而图像的其余部分为空
要解决此问题,请继续读取流,直到它指示没有其他内容
using (Stream stream = await Client.FilesManager.DownloadStreamAsync(file.Id))
{
int bytesRead;
var buffer = new byte[8192];
do
{
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
await fileStream.WriteAsync(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
在流中使用CopyTo。尝试stream.CopyTo(fileStream)。你确定从流中读取的字节数是正确的吗?是的,这很有效!谢谢8192是预期的块大小吗?这个数字是从哪里来的?8192只是一个4K对齐的二次幂。可以随意使用不同的值,但我会坚持这种模式。stream.ReadAsync
在任何一个操作中最多读取缓冲区的长度。在验证我给出的答案时,我将看到4096和8192字节读取,这表明该操作更喜欢4K对齐的缓冲区。