2012-04-13 1 views
4

Я пытаюсь удалить все в контейнерах с именем «cached» под деревом в моем хранилище blob.Удалить все содержит с именем в хранилище blob

Моя структура что-то вроде этого

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

Я хочу, чтобы удалить все под «СМИ», это в «кэшированных» папку.

Какой хороший подход к этому? Код вручную? У меня около 100 000 папок с «кэшированным» именем, которое я бы хотел удалить.

ответ

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(); 
    } 
} 

Конечно, вы должны сначала проверить, что против некоторых тестовых данных в эмуляторе хранения, и обратите внимание, что шаблон нужно будет адаптировать при переходе к реальному облачного хранилища.

Надежда это помогает ...

+1

Спасибо, это сработало! Я не мог заставить reg-ex соответствовать, так что я просто сделал string.contains пару раз. Это отлично поработало в моей ситуации. – Nate

-3

Вы всегда можете использовать http://azurestorageexplorer.codeplex.com/ Нет необходимости писать код

+1

OP сказал: «У меня есть около 100 тысяч папок, которые имеют„кэшированные“имя, которое я хотел бы удалить.» –

1

В хранилище Windows Azure, у вас есть только глубина 1 контейнер. Все остальное на самом деле является частью имени блоба. Итак, в вашем случае у вас есть «корневой» контейнер и куча blob-файлов под названием «media/1324/cached/blobname». Это просто длинная строка с разделителем в этом случае '/'.

В вашем сценарии было бы проще перечислить каждый кадр под контейнером «root», используя фильтр «префикс» операции ListBlobs для «media». После того, как вы очистите blobs, чтобы начать с «media», затем перейдите по ним и найдите те, у которых также есть «кеш».

Если бы вы выбрали другое соглашение об именах, вы могли бы иметь хранилище памяти с вами при поиске файлов. Вам нужно было бы переключить имена, но так, чтобы сначала появился «кеш» (например, «media/cache/1234/blobname»). Затем вы можете снова фильтровать префикс с помощью ListBlobs и возвращать только капли, начинающиеся с «media/cache».

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; 
     } 
Смежные вопросы