Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Box.V2 API,DownloadStreamAsync调用会导致文件损坏_C#_Windows_Box Api - Fatal编程技术网

C# 使用Box.V2 API,DownloadStreamAsync调用会导致文件损坏

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

我正在开发一个小程序,从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.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对齐的缓冲区。