pictures
というAzureにblobコンテナーがあり、その中にさまざまなフォルダーがあります(以下のスナップショットを参照)。
スナップショットに表示されているusers
およびuploads
という名前のフォルダーを削除しようとしていますが、エラーが続きます:Failed to delete blob pictures/uploads/. Error: The specified blob does not exist.
誰が私がこれらの2つのフォルダーを削除できるかについて光を当てることができますか?この問題をグーグルで調べることで、意味のある何かを発見することはできませんでした。
注:必要に応じて詳細をお尋ねください
Windows Azure Blob Storageにはフォルダーの概念がありません。階層は非常に単純です:ストレージアカウント>コンテナー> blob。実際、特定のフォルダーを削除すると、フォルダー名で始まるすべてのBLOBが削除されます。以下の簡単なコードを記述して、フォルダーを削除できます。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("your storage account");
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("pictures");
foreach (IListBlobItem blob in container.GetDirectoryReference("users").ListBlobs(true))
{
if (blob.GetType() == typeof(CloudBlob) || blob.GetType().BaseType == typeof(CloudBlob))
{
((CloudBlob)blob).DeleteIfExists();
}
}
container.GetDirectoryReference( "users")。ListBlobs(true)「picture」コンテナ内の「users」で始まるblobをリストします。その後、個別に削除できます。他のフォルダーを削除するには、このように指定するだけですGetDirectoryReference( "your folder name")。
「フォルダ」は実際には存在しないためです。 Azureストレージアカウントには、BLOBで満たされたコンテナーがあります。クライアントによって「フォルダ」として視覚化されるのは、アカウント「pictures/uploads /」内のブロブのファイル名です。 「フォルダ」を削除する場合、実際には、同じ「パス」で名前が付けられている各BLOBを削除する必要があります。
最も一般的なアプローチは、これらのBLOBのリストを取得し、それをBLOBの削除呼び出しにフィードすることです。
Microsoftのデスクトップストレージエクスプローラーもあります。仮想フォルダーを選択して削除すると、すべてのサブBLOBを効果的に削除できる機能があります。
https://Azure.Microsoft.com/en-us/features/storage-Explorer/
ListBlobsSegmentedAsycを使用して「フォルダー」を削除する方法の例から始めましょう。
var container = // get container reference
var ctoken = new BlobContinuationToken();
do
{
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
ctoken = result.ContinuationToken;
await Task.WhenAll(result.Results
.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
.Where(task => task != null)
);
} while (ctoken != null);
それが何を...
var ctoken = new BlobContinuationToken();
「フォルダ」には多くのファイルが含まれる場合があります。 ListBlobSegmentedAsycは、それらの一部のみを返す場合があります。このトークンは、次の呼び出しで続行する情報を保存します。
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
すべての引数については、 https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=Azure-dotnet を参照してください。
(item as CloudBlob)?.DeleteIfExistsAsync()
これで、result.ResultsにIListBlobItemのリストができました。 IListBlobItemは削除可能なCloudBlobであることが保証されていないため(useFlatBlobListing = falseを設定した場合は仮想フォルダーになる可能性があるため)、可能な場合はキャストして削除しようとします。
result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
すべての結果に対して削除をトリガーし、タスクのリストを返します。
.Where(task => task != null)
結果にCloudBlobにキャストできないアイテムが含まれている場合、タスクのリストにはnull値が含まれています。それらを削除する必要があります。
...次に、現在のセグメントのすべての削除が完了するまで待機し、使用可能な場合は次のセグメントに進みます。
ライフサイクル管理を使用して、prefixMatchでファイルを削除し、プロパティdaysAfterModificationGreaterThan
で削除するアクションを使用できます。ルールを約24時間アクティブのままにします。そして、それは仕事をします。 https://docs.Microsoft.com/en-us/Azure/storage/blobs/storage-lifecycle-management-concepts で利用可能なライフサイクル管理のドキュメント
ADFの削除アクティビティを使用して、任意のファイル/ blobを削除できるようになりました。内部のすべてのファイルを削除します