Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get hold of all the blobs in a Blob container which has sub directories levels(n levels)?

Tags:

c#

blobs

azure

Tried using the ListBlobsSegmentedAsync method , but this returns only the blobs from the main parent directory level ..

But I need the entire list of blobs at one go from all the n levels of subdirectories.

BlobContinuationToken continuationToken = null;
bool useFlatBlobListing = true;
BlobListingDetails blobListingDetails = BlobListingDetails.None;
int maxBlobsPerRequest = 500;
var blobOptions = new BlobRequestOptions (true );

do
 {
    var listingResult = await cbDir.ListBlobsSegmentedAsync(useFlatBlobListing, blobListingDetails, maxBlobsPerRequest, continuationToken, null, null);
    continuationToken = listingResult.ContinuationToken;
    srcBlobList.AddRange(listingResult.Results);
 } while (continuationToken != null);
like image 370
NITHESHKUMAR R Avatar asked May 22 '15 11:05

NITHESHKUMAR R


People also ask

How do I access blob storage containers?

Navigate to your storage account overview in the Azure portal. Under Data storage on the menu blade, select Blob containers. Select the containers for which you want to set the public access level. Use the Change access level button to display the public access settings.


2 Answers

The ListBlobsSegmentedAsync method has 2 overloads that contain the useFlatBlobListing argument. These overloads accept 7 or 8 arguments, and I count 6 in your code. Because there are so many arguments, you can use named arguments to make the code easier to understand.

The code below has been tested successfully in .NET Core.

BlobContinuationToken blobContinuationToken = null;
do
{
    var resultSegment = await cloudBlobContainer.ListBlobsSegmentedAsync(
        prefix            : null,
        useFlatBlobListing: true, 
        blobListingDetails: BlobListingDetails.None,
        maxResults        : null,
        currentToken      : blobContinuationToken,
        options           : null,
        operationContext  : null
    );

    // Get the value of the continuation token returned by the listing call.
    blobContinuationToken = resultSegment.ContinuationToken;
    foreach (IListBlobItem item in resultSegment.Results)
    {
        Console.WriteLine(item.Uri);
    }
} while (blobContinuationToken != null); // Loop while the continuation token is not null.

This code is derived from Microsoft's storage-blobs-dotnet-quickstart repository.

like image 156
Chris Koester Avatar answered Sep 29 '22 11:09

Chris Koester


Use this override of ListBlobsSegmentedAsync method: https://msdn.microsoft.com/en-us/library/dn434672.aspx and make sure that you pass true for useFlatBlobListing parameter. This will list all blobs from all subdirectories.

UPDATE

This is the code I have used and it returns me the blobs in that subfolder and all subfolders inside that subfolder.

    /// <summary>
    /// Code to fetch blobs from "temp" folder inside "blah" blob container.
    /// </summary>
    private static void GetFilesInSubfolder()
    {
        var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
        var blobClient = account.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("blah");
        var directory = container.GetDirectoryReference("temp");
        var result = directory.ListBlobsSegmented(true, BlobListingDetails.None, 500, null, null, null);
        var blobs = result.Results;
    }
like image 39
Gaurav Mantri Avatar answered Sep 29 '22 10:09

Gaurav Mantri