2012-04-05 4 views
1

Я получаю список IListBlobItems, используя CloudBlobContainer.ListBlobs. Я затем цикл по каждой записи, чтобы показать размер сгустка, используя следующий код:Microsoft.WindowsAzure.StorageClient.CloudBlockBlob.DownloadBlockList возвращает 0 блоков

 foreach (IListBlobItem item in blobs) 
     { 
      if (item.GetType() == typeof(CloudBlobDirectory)) 
      { } 
      else if (item.GetType() == typeof(CloudBlockBlob)) 
      { 
       CloudBlockBlob blockBlob = (CloudBlockBlob)item; 
       IEnumerable<ListBlockItem> blocks = blockBlob.DownloadBlockList(new BlobRequestOptions { BlobListingDetails = BlobListingDetails.All }); 
       Console.WriteLine(blockBlob.Name.PadRight(50, ' ') + 
        blocks.Sum(b => b.Size)); 
      } 
      else 
      { 
       Console.WriteLine(item.Uri.LocalPath); 
      } 

     } 

Однако, когда я проверяю счетчик на переменной blocks, всегда 0. Почему?

ответ

5

Я считаю (не уверенным на 100%), что DownloadBlockList() действителен только в том случае, если блок сначала загружался в блоки, а не сразу. Возможно, поэтому вы не получаете никаких блоков.

В любом случае вам, похоже, нужен только общий размер капли. Таким образом, используя blob.Properties.Length свойство может быть более простой подход:

CloudBlockBlob blockBlob = (CloudBlockBlob)item; 
blockBlob.FetchAttributes(); 
Console.WriteLine(blockBlob.Name.PadRight(50, ' ') + blockBlob.Properties.Length); 
+0

Отлично! Именно то, что я ищу. –

0

Я думаю, вы должны проверить CloudBlob вместо типа CloudBlockBlob. Если вы добавите еще что-нибудь, если с этим вы получите размеры? Если это не так, вы видите, что код переходит в else if, а b.size равен нулю?

+0

Спасибо за ответ, но я думаю, что только CouldBlockBlobs есть блоки, хотя. На самом деле CloudBlob не имеет метода DownloadBlockList. Только CloudBlockBlob имеет этот метод. –