ListBlobs 不列出已删除的 blob
ListBlobs does not list Deleted blobs
我正在尝试列出 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。
您使用的是非常旧的 NuGet 包,您应该升级到 Azure.Storage.Blobs。
然后使用分页获取所有 blob,如the docs:
所示
private static async Task ListBlobsFlatListing(BlobContainerClient blobContainerClient,
int? segmentSize)
{
try
{
// Call the listing operation and return pages of the specified size.
var resultSegment = blobContainerClient.GetBlobsAsync()
.AsPages(default, segmentSize);
// Enumerate the blobs returned for each page.
await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
{
foreach (BlobItem blobItem in blobPage.Values)
{
Console.WriteLine("Blob name: {0}", blobItem.Name);
}
Console.WriteLine();
}
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
throw;
}
}
使用可选的 blobstates 参数指定您要列出已删除的 blob
在经历了很多头痛和 回答的一些帮助之后,我想出了如何检索已删除的 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}");
}
}
}
我尝试使用 blobstate
列出未提交的 blob。
但是 GetBlobsByHierarchyAsync
与 BlobStates.Uncommitted
return 的结果与 BlobStates.None
.
相同
我的代码:
var blobHierarchyItems = await lobContainerClient
.GetBlobsByHierarchyAsync(BlobTraits.None, blobStates);
Console.WriteLine("BlobStates " + blobStates);
foreach(var blobHierarchyItem in blobHierarchyItems)
{
Console.WriteLine("Blob.Name " + blobHierarchyItem.Blob.Name);
Console.WriteLine("Blob.Properties.LastModified " + blobHierarchyItem.Blob.Properties.LastModified);
}
结果:
BlobStates 未提交
Blob.Name testing_6.bin Blob.Properties.LastModified 25.03.2022 6:30:04 +00:00
Blob.Name testing_7.bin Blob.Properties.LastModified 25.03.2022 6:30:25 +00:00
Blob.Name testing_8.bin Blob.Properties.LastModified 25.03.2022 13:47:46 +00:00
BlobStates None
Blob.Name testing_6.bin Blob.Properties.LastModified 25.03.2022 6:30:04 +00:00
Blob.Name testing_7.bin Blob.Properties.LastModified 25.03.2022 6:30:25 +00:00
Blob.Name testing_8.bin Blob.Properties.LastModified 25.03.2022 13:47:46 +00:00
我是不是有什么问题?谢谢
我正在尝试列出 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。
您使用的是非常旧的 NuGet 包,您应该升级到 Azure.Storage.Blobs。
然后使用分页获取所有 blob,如the docs:
所示private static async Task ListBlobsFlatListing(BlobContainerClient blobContainerClient,
int? segmentSize)
{
try
{
// Call the listing operation and return pages of the specified size.
var resultSegment = blobContainerClient.GetBlobsAsync()
.AsPages(default, segmentSize);
// Enumerate the blobs returned for each page.
await foreach (Azure.Page<BlobItem> blobPage in resultSegment)
{
foreach (BlobItem blobItem in blobPage.Values)
{
Console.WriteLine("Blob name: {0}", blobItem.Name);
}
Console.WriteLine();
}
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
throw;
}
}
使用可选的 blobstates 参数指定您要列出已删除的 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}");
}
}
}
我尝试使用 blobstate
列出未提交的 blob。
但是 GetBlobsByHierarchyAsync
与 BlobStates.Uncommitted
return 的结果与 BlobStates.None
.
我的代码:
var blobHierarchyItems = await lobContainerClient
.GetBlobsByHierarchyAsync(BlobTraits.None, blobStates);
Console.WriteLine("BlobStates " + blobStates);
foreach(var blobHierarchyItem in blobHierarchyItems)
{
Console.WriteLine("Blob.Name " + blobHierarchyItem.Blob.Name);
Console.WriteLine("Blob.Properties.LastModified " + blobHierarchyItem.Blob.Properties.LastModified);
}
结果:
BlobStates 未提交
Blob.Name testing_6.bin Blob.Properties.LastModified 25.03.2022 6:30:04 +00:00
Blob.Name testing_7.bin Blob.Properties.LastModified 25.03.2022 6:30:25 +00:00
Blob.Name testing_8.bin Blob.Properties.LastModified 25.03.2022 13:47:46 +00:00
BlobStates None
Blob.Name testing_6.bin Blob.Properties.LastModified 25.03.2022 6:30:04 +00:00
Blob.Name testing_7.bin Blob.Properties.LastModified 25.03.2022 6:30:25 +00:00
Blob.Name testing_8.bin Blob.Properties.LastModified 25.03.2022 13:47:46 +00:00
我是不是有什么问题?谢谢