How to Get Azure Blob Container Size
UPDATE: an updated version of this script is available here.
I recently wanted to find out the total size of all the files in a particular blob container in my Azure storage account, but to my surprise, this information doesn’t seem to be readily available in either the old or new Azure portal.
Fortunately it can be calculated with only a few lines of code. I tend to use LINQPad for this kind of thing, to create an easily reusable snippet. Let’s look first at my LINQPad script for getting a blob container size, and then we’ll explain what each line does.
var key = Util.GetPassword("Storage Account Key");
var accountName = "mystorageaccount";
var connectionString = "DefaultEndpointsProtocol=https;AccountName="
+ accountName + ";AccountKey=" + key;
var account = CloudStorageAccount.Parse(connectionString);
var blobClient = account.CreateCloudBlobClient();
var blobContainer = blobClient.GetContainerReference("mycontainer");
long fileSize = 0;
foreach (CloudBlockBlob blobItem in blobContainer.ListBlobs())
{
fileSize += blobItem.Properties.Length;
}
fileSize.Dump();
So first of all, I need to point out that you will need a reference to the WindowsStorage.Azure NuGet package, and to bring in the Microsoft.WindowsAzure.Storage
and Microsoft.WindowsAzure.Storage.Blob namespaces.
If you’re using LINQPad, F4 is a handy keyboard shortcut to remember, as it brings up the references dialog.
Then we need to construct a storage account connection string. I’m using a nice helper method in LINQPad called Util.GetPassword
that saves me from storing my secret keys in my LINQPad scripts directly. The key can be got from the “Manage Access Keys” link in the Azure portal. You also will need to know your storage account name, and then you can construct your connection string.
From that you create a CloudStorageAccount
, and then a CloudBlobClient
. This allows you to get a reference to your container, again by supplying its name.
Now all we need to do is call ListBlobs
on the blob container, and iterate through adding together the Length
. Note that one gotcha is that ListBlobs
returns an IEnumerable<IListBlobItem>
, and you need to cast these to be CloudBlobClient
to access the Length
.
And of course, if you are a LINQ enthusiast (which you should be!), you’ll know that you can do this in one line of LINQ like this:
var fileSize = blobContainer.ListBlobs().OfType<CloudBlockBlob>()
.Sum(b =>b.Properties.Length);
Finally, if you’re not familiar with LINQPad, the .Dump()
call at the end is just an extension method that LINQPad provides to print details of whatever object you call it on to the Results panel.
Update: I really ought to have mentioned that if your blobs are in a nested folder structure, then you will need to set the useFlatBlobListing parameter to true to get them all back, like this:
blobContainer.ListBlobs(null,true)
Comments
how do you explain to me? if i have 100,000 files in container? the time to process this is so longer..
Elisandro Marcosyes, it has to add together the size of each file. So it won't be quick with 100,000 files. I'm not aware of another way although might be worth checking to see if a new feature has been added to the SDK to directly get the size of a container
Mark HeathSimilarly how can the get the size of all other service in storage like files, tables & queues ? Appreciate if you can provide a code snippet for these.
vyasin Java