Как удалить папку в контейнере 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.