C#从Azure检索Blob列表

and*_*ewb 2 c# azure azure-storage-blobs

在一定的保留期限之后,我需要一些存档清理代码来删除旧的Azure日志。

我知道我可以这样做:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("ctr");

var blobList = container.ListBlobs();
foreach(var blob in blobList)
{
    logger.Info($"Blob Name: {blob.Uri}");
}
Run Code Online (Sandbox Code Playgroud)

但是在我的容器中结构是

/
/year/month/day/hour/files
Run Code Online (Sandbox Code Playgroud)

所以现在有

/2017/5/11/14/files
/2017/5/11/17/files
/2017/5/11/22/files
/2017/5/11/23/files
Run Code Online (Sandbox Code Playgroud)

/2017/5/12/11/files
Run Code Online (Sandbox Code Playgroud)

其中文件是多个备份文件。

for循环中只有1个项目,因为2017文件夹是根目录。

有没有办法检索所有斑点?

最终目标是删除所有早于保留期的Blob。

Ran*_*dom 5

试试这个模式。在浏览大型存储时可以方便使用。我发现它对GC和内存占用空间更为友好

var blobAccount = "<account>";
var apiKey = "<api-key>";
var containerName = "<container>";
var storageCredentials = new StorageCredentials(blobAccount, apiKey);

var account = new CloudStorageAccount(storageCredentials, true);
var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
var blobLimit = 500

if (container == null) { return; }

var blobContinuationToken = new BlobContinuationToken();

using (var fs = new FileStream("Output.csv", FileMode.Create))
{
    var sw = new StreamWriter(fs);
    sw.WriteLine("Type,Name,Length");

    BlobContinuationToken continuationToken = null;
    do
    {   
        var blobList = container.ListBlobsSegmented("",
                                   true,
                                   BlobListingDetails.Metadata,
                                   blobLimit,
                                   continuationToken,
                                   new BlobRequestOptions
                                   {
                                       LocationMode = LocationMode.PrimaryOnly
                                   },
                                   null);

        continuationToken = blobList.ContinuationToken;

        // I was looking only for BlockBlobs
        foreach (var item in blobList.Results.OfType<CloudBlockBlob>())
        {
            sw.WriteLine($"block,\"{item.Name}\",{item.Properties.Length}");
        }

    } while (continuationToken != null);
}
Run Code Online (Sandbox Code Playgroud)