【问题标题】:C# retrieving a list of blobs from AzureC# 从 Azure 中检索 blob 列表
【发布时间】:2017-10-12 05:55:38
【问题描述】:

我需要一些存档清理代码来在特定保留期过后删除旧的 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}");
}

但是在我的容器中结构是

/
/year/month/day/hour/files

所以现在有

/2017/5/11/14/files
/2017/5/11/17/files
/2017/5/11/22/files
/2017/5/11/23/files

/2017/5/12/11/files

其中 files 是多个备份文件。

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

有没有办法检索所有 blob?

最终目标是删除所有超过保留期的 blob。

【问题讨论】:

    标签: c# azure azure-blob-storage


    【解决方案1】:

    试试这个模式。浏览大型存储时可以派上用场。我发现它对 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);
    }
    

    【讨论】:

    • 这将我的内存占用从 12gb 降低到了 100mb 左右,完美!
    【解决方案2】:

    像这样使用UseFlatBlobListing 参数:

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse("");
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference("ctr");
    
    var blobList = container.ListBlobs(useFlatBlobListing: true)
    foreach(var blob in blobList)
    {
        logger.Info($"Blob Name: {blob.Uri}");
    }
    

    这将以扁平的方式为您提供所有 blob。

    https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobcontainer.listblobs?view=azure-dotnet

    如果您还包括prefix 参数,您可以根据文件夹结构过滤结果。要在 2017 年 5 月获得一切,您可以这样做

    var blobList = container.ListBlobs(prefix: "2017/5/", useFlatBlobListing: true)
    

    这可能有助于减少 blob 列表,具体取决于您的保留情况。

    【讨论】:

    • 我们如何为所有容器中的所有 blob 执行此操作?
    • @l--''''''---------'''''''''''' 你必须先遍历容器,见@ 987654322@
    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 2021-12-23
    • 2017-01-13
    • 2019-12-19
    • 2011-09-07
    • 2017-03-10
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多