4

Blob Storage のツリーの下にある "cached" という名前のコンテナー内のすべてを削除しようとしています。

私の構造はこのようなものです

-Root
    -Bin
    -Media
       -1324
         -cached
       -5648
         -cached
    -Images
       -cached

「キャッシュ」フォルダーにある「メディア」の下のすべてを削除したい。

これに対する良いアプローチは何ですか?手でコーディング?削除したい「キャッシュされた」名前のフォルダーが約 100,000 個あります。

4

4 に答える 4

3

Azure Storage 4.3.0.0 を使用した新しいアプローチを次に示します。

public void DeleteFolder(string Container, string Prefix)
        {
            if (!string.IsNullOrEmpty(Prefix))
            {
                var _Container = GetBlobContainer(Container);
                var _Blobs = _Container.ListBlobs(Prefix, true);
                foreach (IListBlobItem blob in _Blobs)
                {
                    _Container.GetBlockBlobReference(((CloudBlockBlob)blob).Name).DeleteIfExists();
                }
            }
        }

public CloudBlobContainer GetBlobContainer(string container)
        {
            // Retrieve storage account from connection string.
            CloudStorageAccount _StorageAccount = CloudStorageAccount.Parse(
                CloudConfigurationManager.GetSetting("StorageConnectionString"));

            // Create the blob client.
            CloudBlobClient _BlobClient = _StorageAccount.CreateCloudBlobClient();

            // Retrieve a reference to a container. 
            CloudBlobContainer _Container = _BlobClient.GetContainerReference(container);

            // Retrieve reference to a blob named "myblob".
            return _Container;
        }
于 2014-11-07T22:16:51.353 に答える
3

多分いくつかの正規表現がそのトリックを行うことができますか?

string pattern = @"/devstoreaccount1/Root/Media/([A-Za-z0-9\-]+)/cached/([A-Za-z0-9\-]+)";
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
foreach (var blob in blobClient.GetContainerReference("Root").ListBlobs(new BlobRequestOptions { UseFlatBlobListing = true }))
{
    if (Regex.Match(blob.Uri.AbsolutePath, pattern).Success)
    {
        ((CloudBlockBlob)blob).Delete();
    }
}

もちろん、最初にストレージ エミュレーターのいくつかのテスト データに対してそれをテストする必要があります。実際のクラウド ストレージに切り替えるときにパターンを適応させる必要があることに注意してください。

それが役に立てば幸い...

于 2012-04-15T20:18:45.800 に答える
1

Windows Azure ストレージでは、コンテナーの深さは 1 つだけです。他のすべては、実際には blob の名前の一部です。したがって、あなたの場合、「ルート」コンテナーと「media/1324/cached/blobname」という名前の一連の blob ファイルがあります。この「/」の場合、区切り文字付きの単なる長い文字列です。

あなたのシナリオでは、「メディア」の ListBlobs 操作の「プレフィックス」フィルターを使用して、「ルート」コンテナーの下にある各 BLOB を列挙するのが最も簡単です。「メディア」で始まるようにブロブをフィルタリングしたら、それらを繰り返し処理し、「キャッシュ」も含まれているブロブを見つけます。

別の命名規則を選択した場合は、BLOB ストレージを使用してファイルを見つけることができます。ただし、'cache' が最初になるように名前を切り替える必要があります (例: 'media/cache/1234/blobname')。次に、ListBlobs を使用してプレフィックスで再度フィルター処理し、「media/cache」で始まる BLOB のみを返すことができます。

于 2012-04-21T15:09:35.087 に答える
-3

いつでもhttp://azurestorageexplorer.codeplex.com/を使用でき ます。コードを記述する必要はありません

于 2012-04-14T02:07:11.490 に答える