2014-11-11 2 views
5

MS объявила каталог как хранилище blob, и я пытаюсь использовать его как каталоги. Имея сохранить некоторые сгустки именами:Как найти подкаталоги в хранилище Azure blob

Common\Service1\Type1\Object1 
Common\Service1\Type1\Object2 
Common\Service1\Type2\Object1 
Common\Service1\Type2\Object2 
Common\Service1\Type3\Object1 
Common\Service1\Type3\Object2 
Common\Service1\Type3\Object3 

Я хотел бы иметь возможность перечислить подкаталогов, например У меня есть blobclient, связанный с именем контейнера Common, и я хотел бы получить список подконтейнеров Type1, Type2, Type3. Возможно ли получить список подкаталогов в некотором каталоге. Использование ListBlobs возвращает полный список блоков в текущем контейнере.

+0

Вы говорите о Хранилище Blob или службе файлов Azure? –

+0

@GauravMantri, Azure Blobstorage –

ответ

6

Если вы хотите перечислить все "подкаталоги" в директории "Common \ Service1" вы можете использовать что-то вроде этого:

var directory = blobContainer.GetDirectoryReference(@"Common/Service1"); 
    var folders = directory.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList(); 
    foreach (var folder in folders) 
    { 
     Console.WriteLine(folder.Uri); 
    } 

Полный пример кода:

var random = new Random(); 
    CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount; 
    var cloudBlobClient = storageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer blobContainer = cloudBlobClient.GetContainerReference("test-container"); 
    blobContainer.CreateIfNotExists(); 
    string[] objects = new[] 
          { 
           @"Common\Service1\Type1\Object1", @"Common\Service1\Type1\Object2", @"Common\Service1\Type2\Object1", 
           @"Common\Service1\Type2\Object2", @"Common\Service1\Type3\Object1", @"Common\Service1\Type3\Object2", 
           @"Common\Service1\Type3\Object3" 
          }; 
    foreach (var newObject in objects) 
    { 
     var newBlob = blobContainer.GetBlockBlobReference(newObject); 
     var buffer = new byte[1024]; 
     random.NextBytes(buffer); 
     newBlob.UploadFromByteArray(buffer,0,buffer.Length); 
    } 

    var directory = blobContainer.GetDirectoryReference(@"Common/Service1"); 
    var folders = directory.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList(); 
    foreach (var folder in folders) 
    { 
     Console.WriteLine(folder.Uri); 
    } 

Этот выход будет Uri для типов Type1, Type2 и Type3.

+0

В коде есть ошибка, он использует '/' вместо обратной косой черты –

+0

На самом деле это не так. Я неважно, как вы получаете ссылку на blob 'blobContainer.GetBlockBlobReference', как'/', так и' \ 'работает, но почему-то GetDirectoryReference должен быть с' \ '(Uri style), я думаю, что он имеет что-то делать с каталогом, являющимся только префиксом, и все префиксы blob сохраняются в формате Uri. – b2zw2a

+0

для меня было достаточно, чтобы узнать, есть ли метод, например blobContainer.GetDirectoryReference (@ "Common/Service1"); Благодаря! – dorsz

5

Строительство на b2zw2a's answer:

  • @ требуется только при использовании \, не /.
  • Не связывайте ToList() после ListBlobs(). ListBlobs() обеспечивает ленивую загрузку и даст вам лучший перфект.
  • Используйте OfType<CloudBlobDirectory>() отфильтровать только тип, который вы хотите

Давать вам:

var directory = blobContainer.GetDirectoryReference("Common/Service1"); 
var folders = directory.ListBlobs().OfType<CloudBlobDirectory>(); 
foreach (var folder in folders) 
{ 
    Console.WriteLine(folder.Uri); 
} 
0
var nameList=logoContainer.ListBlobs().Where(b => b as CloudBlobDirectory != null).Select(x => x.Uri + "").ToList(); 

С помощью этого вы можете получить все имена файлов в одном запросе.