it-swarm.com.ru

Как удалить папку в контейнере BLOB-объектов Azure

У меня есть контейнер BLOB-объектов в Azure с именем pictures, в котором находятся различные папки (см. Снимок ниже):

 enter image description here

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

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

13
Hassan Baig

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

19
forester123

Это потому, что «папок» на самом деле не существует. В учетной записи хранения Azure у вас есть контейнеры, которые заполнены BLOB-объектами. То, что клиенты видят как «папки», - это имена файлов больших двоичных объектов в учетной записи «картинки/загрузки /». Если вы хотите удалить «папку», вам на самом деле нужно удалить каждый из BLOB-объектов с одинаковым «путем». 

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

8
BrentDaCodeMonkey

Давайте начнем с примера того, как удалить «папку» с помощью 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 сообщит Azure, где продолжить

Для всех аргументов см. 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, наш список задач содержал бы нулевые значения. Мы должны удалить их.

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

3
Christoph Lütjen

Также есть настольный накопитель Explorer от Microsoft. Он имеет функцию, где вы можете выбрать виртуальную папку, а затем удалить ее, удалив все вспомогательные объекты. 

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

1
stueynet