Как удалить папку в контейнере Azure blob

У меня есть контейнер blob в Azure с именем pictures, в котором есть различные папки (см. снимок ниже):

введите описание изображения здесь

Я пытаюсь удалить папки под названием users и uploads, показанные в снимке, но я сохраняю ошибку: Failed to delete blob pictures/uploads/. Error: The specified blob does not exist. Может ли пролить свет на то, как я могу удалить эти две папки? Я не смог раскрыть что-либо значимое с помощью Googling этой проблемы.

Примечание: попросите меня получить дополнительную информацию, если вам это нужно

Ответ 1

В Windows Azure Blob Storage отсутствует концепция папок. Иерархия очень проста: учетная запись хранилищa > контейнеp > 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) показывает, что blobs начинаются с "пользователей" в контейнере "картинка", и вы можете их удалить отдельно. Чтобы удалить другие папки, достаточно просто указать GetDirectoryReference ( "имя вашей папки" ).

Ответ 2

Это потому, что "папки" на самом деле не существуют. На счету хранения Azure у вас есть контейнеры, заполненные капли. То, что вы видите визуализированным клиентами как "папки", - это имена файлов капли в учетной записи "images/uploads/". Если вы хотите удалить "папку", вам действительно нужно удалить каждый из блоков, названных одним и тем же "путем".

Наиболее распространенный подход заключается в том, чтобы получить список этих блоков, а затем передать их на вызов delete blob.

Ответ 3

Существует также настольный проводник для хранения данных от Microsoft. В нем есть функция, в которой вы можете выбрать виртуальную папку, а затем удалить ее, удалив все субблоки.

https://azure.microsoft.com/en-us/features/storage-explorer/

Ответ 4

Начнем с примера того, как удалить "папку" с помощью 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-объекта ("путь").
  • Второй аргумент "useFlatBlobListing = true" указывает клиенту возвращать все элементы во всех подпапках. Если установлено значение false, он будет работать в режиме "виртуальных папок" и вести себя как файловая система.
  • Ctoken скажет лазурь, где продолжить

Для всех аргументов см. Https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet для получения подробной информации.

(item as CloudBlob)?.DeleteIfExistsAsync()

Теперь у нас есть список IListBlobItem в результате. Результаты. Поскольку IListBlobItem не гарантированно является удаляемым CloudBlob (например, это может быть виртуальная папка, если бы мы установили useFlatBlobListing = false), мы пытаемся привести его к действию и удалить, если это возможно.

result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())

Триггеры удаляют для всех результатов и возвращает список задач.

.Where(task => task != null)

Если Результаты содержали элементы, которые мы не могли преобразовать в CloudBlob, наш список задач содержал бы нулевые значения. Мы должны удалить их.

... затем мы ждем, пока все удаления для текущего сегмента завершатся, и продолжаем со следующим сегментом, если он доступен.

Ответ 5

Теперь вы можете использовать управление жизненным циклом для удаления файла с помощью prefixMatch и действие для удаления со свойством daysAfterModificationGreaterThan. Оставьте правило активным примерно на 24 часа. И это сделает работу. Документация по управлению жизненным циклом доступна по адресу https://docs.microsoft.com/en-us/azure/storage/blobs/storage-lifecycle-management-concepts.