Reputation: 4652
MS has announced directory like blob storage, and I'm trying to use it like directories. Having save some blobs by names:
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
I'd like to have possibility to enumerate subdirectories, e.g. I have blobclient referenced to Common
container name, and I would like to get subcontainers list Type1, Type2, Type3
. Is it possible to get list of subdirectories in some directory. Using ListBlobs returns full list of blobs within current container.
Upvotes: 14
Views: 37930
Reputation: 891
var nameList=logoContainer.ListBlobs().Where(b => b as CloudBlobDirectory != null).Select(x => x.Uri + "").ToList();
By using this you can get all the filenames in a single query.
Upvotes: -1
Reputation: 5218
Building on b2zw2a's answer:
@
is only needed when using \
, not /
.ToList()
after ListBlobs()
. ListBlobs()
provides lazy loading and will give you better perf.OfType<CloudBlobDirectory>()
to filter out only the type you wantGiving you:
var directory = blobContainer.GetDirectoryReference("Common/Service1");
var folders = directory.ListBlobs().OfType<CloudBlobDirectory>();
foreach (var folder in folders)
{
Console.WriteLine(folder.Uri);
}
Upvotes: 10
Reputation: 2693
If you would like to list all "subdirectories" in "Common\Service1" directory you can use something like this:
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);
}
Full code sample:
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);
}
This will output Uri for Type1,Type2 and Type3 directory.
Upvotes: 19