c# - ListBlobs 不列出已删除的 blob

标签 c# azure azure-blob-storage

我正在尝试列出 Azure 存储帐户中所有已删除的 blob。这是我的代码:

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

var blobClient = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true).CreateCloudBlobClient();
var container = blobClient.GetContainerReference("container");
var blobs = container.ListBlobs(useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Deleted).ToList();

但是,ListBlobs 的结果是容器中所有未删除的 blob。在 Azure 门户中,我可以清楚地看到此容器中还有更多已删除的 blob,但它们没有被正确检索。

如何仅列出容器中处于已删除状态的 blob?

编辑:

我创建了一个新容器,其中包含两个 blob:test_deleted(我在 Azure 门户中删除了它)和 test_not_deleted。使用较新的 Azure.Blob.Storage 包,我现在拥有以下代码:

var client = new BlobServiceClient(new Uri($"https://{StorageAccountName}.blob.core.windows.net"), new StorageSharedKeyCredential(StorageAccountName, StorageAccountKey));
var container = client.GetBlobContainerClient("test");
var resultSegment = container.GetBlobsAsync(states: BlobStates.Deleted, traits: BlobTraits.All).AsPages(default, 5000);

var results = new List<BlobItem>();

await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
{
    foreach (BlobItem blobItem in blobPage.Values)
    {
        results.Add(blobItem);
    }
}

结果仅包含未删除的 blob。

Azure Portal screenshot

Results view

最佳答案

在经历了很多头痛和 this 的一些帮助之后答案,我已经弄清楚如何检索已删除的 blob。由于某种原因,如果同时启用版本控制和软删除,您检索的 blob 不会将 Deleted 属性设置为 true。相反,它们的 VersionId 属性将为 null

看起来,当使用 BlobStates.DeletedWithVersions 时,会检索所有 Blob,但对于已删除的 Blob,VersionId 将为 null。下面是看似有效的代码,它检索所有标记为已删除的 blob:

var client = new BlobServiceClient(new Uri($"https://{StorageAccountName}.blob.core.windows.net"), new StorageSharedKeyCredential(StorageAccountName, StorageAccountKey));
var container = client.GetBlobContainerClient("test");
var resultSegment = container.GetBlobsAsync(states: BlobStates.DeletedWithVersions, traits:BlobTraits.All).AsPages(default, 5000);

var deletedBlobs = new List<BlobItem>();

await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
{
    foreach (BlobItem blobItem in blobPage.Values)
    {
        if (blobItem.VersionId == null)
        {
            deletedBlobs.Add(blobItem);
        }
    }
}

就我而言,我需要知道某个 blob 是否在某一天被删除。当删除 blob 时,会创建一个新版本。因此,要查找删除日期,您需要使用 BlobStates.Version 检索包含 Blob 名称的所有内容,并检查 Blob 的 VersionId 属性(这是一个日期字符串) 。这将包含版本的创建日期(即 blob 被删除)。

foreach (var deletedBlob in deletedBlobs)
{
    var versions = container.GetBlobs(BlobTraits.None, BlobStates.Version, prefix: deletedBlob.Name);

    foreach(var v in versions)
    { 
        if (deletedOn == DateTime.Parse(v.VersionId))
        {
            Console.WriteLine($"Blob {deletedBlob.Name} deleted on {deletedOn}");
        }
    }
}

关于c# - ListBlobs 不列出已删除的 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70332150/

相关文章:

azure - 如何在 Azure 中选择 blob block 大小

c# - 无法通过 Microsoft Graph API(C# 控制台)发送电子邮件

c# - 如何在 WPF 中捕获从子组件到父组件的激活命令?

c# - 使用 Microsoft.SqlServer.Management.Smo 更改 SQL SERVER EXPRESS 2008 TCP 端口

azure - 从 Azure 函数/逻辑应用访问本地 Active Directory

azure - 当我使用“描述”属性时,机器人无法理解该值

c# - Entity Framework 模型浏览器显示存储过程两次

azure - 存储文件以从 Service Fabric 应用程序流式传输的最快方法是什么?

Django 将 azure-storage 形式的 blob 返回为可下载文件

node.js - 使用 Azure SDK for Node.js 中的 BlobService.getBlobURL() 生成 Azure 共享访问签名