CloudBlob.OpenRead()不读取所有数据

使用Windows Azure存储客户端库,CloudBlob.OpenRead()方法仅读取4 MB的数据。 如何使用OpenRead方法读取完整流。

CloudBlob blob = container.GetBlobReference(filename); Stream stream = blob.OpenRead(); 

我必须使用OpenRead方法。 无法使用DownloadToFile或DownloadToStream。

编辑:我的范围调用之外的消费者代码

 stream.CopyTo(readIntoStream); 

CopyTo是一种扩展方法。

 public static int CopyTo(this Stream source, Stream destination) { byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; int bytesCopied = 0; do { bytesRead = source.Read(buffer, 0, BUFFER_SIZE); if (bytesRead > 0) destination.Write(buffer, 0, bytesRead); bytesCopied += bytesRead; } while (bytesRead > 0); return bytesCopied; } 

编辑2:

我观察到当使用blob.UploadText()方法上传文件时,它工作正常但是当使用OpenWrite方法上传blob时,如下面的代码示例所示,OpenRead方法只读取4194304字节(4 mb)。

 using(var input = File.OpenRead(@"C:\testFile.txt")) //5000000 bytes using (var output = blob.OpenWrite()) { input.CopyTo(output); } 

编辑3:

在我的最后产生问题的完整代码。

  static void Main(string[] args) { var blobContainer = GetContainer("tier1"); blobContainer.CreateIfNotExist(); var containerPermissions = new BlobContainerPermissions(); containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob; blobContainer.SetPermissions(containerPermissions); var blob = blobContainer.GetBlobReference("testfileWithOpenWrite1.txt"); using (var input = File.OpenRead(@"C:\testFile.txt")) //5000000 bytes using (var output = blob.OpenWrite(new BlobRequestOptions())) input.CopyTo(output); Console.WriteLine("uploaded"); int bytesDownloaded = 0; byte[] buffer = new byte[65536]; using (BlobStream bs = blob.OpenRead()) { int chunkLength; do { chunkLength = bs.Read(buffer, 0, buffer.Length); bytesDownloaded += chunkLength; } while (chunkLength > 0); } Console.WriteLine(bytesDownloaded); } public static int CopyTo(this Stream source, Stream destination) { int BUFFER_SIZE = 65536; byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; int bytesCopied = 0; do { bytesRead = source.Read(buffer, 0, BUFFER_SIZE); if (bytesRead > 0) destination.Write(buffer, 0, bytesRead); bytesCopied += bytesRead; } while (bytesRead > 0); return bytesCopied; } 

编辑4 – 结论:

这可能是SDK v1.2附带的Microsoft.WindowsAzure.StorageClient.dll(程序集版本6.0.6002.17043)中的错误。 它适用于最新的Microsoft.WindowsAzure.StorageClient.dll(程序集版本6.0.6002.18312 – SDK v1.4)。

谢谢smarx 🙂

我无法重现你所看到的。 事情似乎按预期工作:

 static void Main(string[] args) { // I also tried a real cloud storage account. Same result. var container = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudBlobClient().GetContainerReference("testcontainer"); container.CreateIfNotExist(); var blob = container.GetBlobReference("testblob.txt"); blob.UploadText(new String('x', 5000000)); var source = blob.OpenRead(); int BUFFER_SIZE = 4000000; byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; int bytesCopied = 0; do { bytesRead = source.Read(buffer, 0, BUFFER_SIZE); bytesCopied += bytesRead; } while (bytesRead > 0); Console.WriteLine(bytesCopied); // prints 5000000 } 

编辑:

我也(响应编辑过的问题)现在尝试使用OpenWrite上传blob,结果是一样的。 (我得到了完整的blob。)我使用这段代码代替blob.UploadText(…):

 using (var input = File.OpenRead(@"testblob.txt")) //5000000 bytes using (var output = blob.OpenWrite()) { input.CopyTo(output); } 

最终的WriteLine仍然打印5000000。

编辑2:

这有点令人厌烦。 将BUFFER_SIZE更改为65536并未更改任何内容。 结果似乎对我来说仍然是正确的。 这是我完整的比较应用程序:

 static void Main(string[] args) { // I also tried a real cloud storage account. Same result. var container = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudBlobClient().GetContainerReference("testcontainer"); container.CreateIfNotExist(); var blob = container.GetBlobReference("testblob.txt"); using (var input = File.OpenRead(@"testblob.txt")) //5000000 bytes using (var output = blob.OpenWrite()) { input.CopyTo(output); } var source = blob.OpenRead(); int BUFFER_SIZE = 65536; byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; int bytesCopied = 0; do { bytesRead = source.Read(buffer, 0, BUFFER_SIZE); bytesCopied += bytesRead; } while (bytesRead > 0); Console.WriteLine(bytesCopied); // prints 5000000 }