web-dev-qa-db-ja.com

Azure BLOBコンテナー内のフォルダーを削除する方法

picturesというAzureにblobコンテナーがあり、その中にさまざまなフォルダーがあります(以下のスナップショットを参照)。

enter image description here

スナップショットに表示されているusersおよびuploadsという名前のフォルダーを削除しようとしていますが、エラーが続きます:Failed to delete blob pictures/uploads/. Error: The specified blob does not exist.誰が私がこれらの2つのフォルダーを削除できるかについて光を当てることができますか?この問題をグーグルで調べることで、意味のある何かを発見することはできませんでした。

注:必要に応じて詳細をお尋ねください

19
Hassan Baig

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")。

30
forester123

「フォルダ」は実際には存在しないためです。 Azureストレージアカウントには、BLOBで満たされたコンテナーがあります。クライアントによって「フォルダ」として視覚化されるのは、アカウント「pictures/uploads /」内のブロブのファイル名です。 「フォルダ」を削除する場合、実際には、同じ「パス」で名前が付けられている各BLOBを削除する必要があります。

最も一般的なアプローチは、これらのBLOBのリストを取得し、それをBLOBの削除呼び出しにフィードすることです。

9

Microsoftのデスクトップストレージエクスプローラーもあります。仮想フォルダーを選択して削除すると、すべてのサブBLOBを効果的に削除できる機能があります。

https://Azure.Microsoft.com/en-us/features/storage-Explorer/

8
stueynet

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);
  • 最初の引数は、必須のblob名(「パス」)プレフィックスです。
  • 2番目の引数「useFlatBlobListing = true」は、すべてのサブフォルダー内のすべてのアイテムを返すようにクライアントに指示します。 falseに設定すると、「仮想フォルダー」モードで実行され、ファイルシステムのように動作します。
  • Ctokenは、続行する場所をAzureに指示します

すべての引数については、 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値が含まれています。それらを削除する必要があります。

...次に、現在のセグメントのすべての削除が完了するまで待機し、使用可能な場合は次のセグメントに進みます。

7

ライフサイクル管理を使用して、prefixMatchでファイルを削除し、プロパティdaysAfterModificationGreaterThanで削除するアクションを使用できます。ルールを約24時間アクティブのままにします。そして、それは仕事をします。 https://docs.Microsoft.com/en-us/Azure/storage/blobs/storage-lifecycle-management-concepts で利用可能なライフサイクル管理のドキュメント

0
nitzien

enter image description here ADFの削除アクティビティを使用して、任意のファイル/ blobを削除できるようになりました。内部のすべてのファイルを削除します

0
Rajat