ob1dev
ob1dev

Reputation: 1230

How to list blobs from virtual directory without prefix?

I have the following list of blobs:

I need to list Blob1, Blob2 and Blob3, so that when accessing the CloudBlockBlob.Name property it returns just Blob1, Blob2 or Blob 3 WITHOUT prefix of virtual directories.

How can I archive this?

Best Wishes, Oleg

Upvotes: 3

Views: 5276

Answers (3)

chris31389
chris31389

Reputation: 9356

I found you can do this:

var storageAccountConnectionString = "...";
var storageAccount = CloudStorageAccount.Parse(storageAccountConnectionString);

var cloudBlobClient = storageAccount.CreateCloudBlobClient();
var cloudBlobContainer = cloudBlobClient.GetContainerReference("containerName");
foreach (var blob in cloudBlobContainer.ListBlobs())
{
    Console.WriteLine(blob.Uri.Segments.Last());
}

Upvotes: 2

Abhijeet
Abhijeet

Reputation: 13856

class Program
{
    const string _conStr = "storage connection string";
    const string _container =  "container name";
    static void Main(string[] args)
    {
        var names = new Program().GetBlobNames();
        Console.ReadKey();
    }

    private List<string> GetBlobNames()
    {
        CloudStorageAccount acc = CloudStorageAccount.Parse(_conStr);
        CloudBlobClient blobClient = acc.CreateCloudBlobClient();
        CloudBlobContainer cntnr = blobClient.GetContainerReference(_container);
        List<IListBlobItem> blobList = cntnr.ListBlobs("").ToList();
        List<string> flatList = new List<string>();
        List<IListBlobItem> blobItems = new List<IListBlobItem>();
        foreach (IListBlobItem blobItem in blobList)
        {
            //If it is cloudblob directory
            if (blobItem.GetType() == typeof(CloudBlobDirectory))
            {
                CloudBlobDirectory dir = blobItem as CloudBlobDirectory;
                GetFilesInDirectory(dir, blobItems);
            }
        }
        return blobItems.Select(b => b.Parent.Uri.MakeRelativeUri(b.Uri).ToString()).ToList();            
    }


    private void GetFilesInDirectory(CloudBlobDirectory directory, List<IListBlobItem> fileList)
    {
        foreach (var blobItem in directory.ListBlobs())
        {
            if (blobItem.GetType() == typeof(CloudBlockBlob))
            {
                CloudBlockBlob blob = (CloudBlockBlob)blobItem;                    
                fileList.Add(blob);
            }
            else if (blobItem.GetType() == typeof(CloudPageBlob))
            {
                CloudPageBlob blob = (CloudPageBlob)blobItem;
                fileList.Add(blob);
            }
            else if (blobItem.GetType() == typeof(CloudBlobDirectory))
            {
                //Fetch recursively all the blobs
                CloudBlobDirectory blob = (CloudBlobDirectory)blobItem;
                GetFilesInDirectory(blob, fileList);
            }
        }
    }
}

Upvotes: 0

user92454
user92454

Reputation: 1211

If you are using the Azure storage .Net client library (I am using version 3.0.3 in which these methods/overloads are available), you could do something this:

var container = GetBlobContainer();
foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true))
{
    Console.WriteLine(blob.Parent.Uri.MakeRelativeUri(blob.Uri));
}

Upvotes: 3

Related Questions