Обход через каталог c Azure Blob Storage и удаление всех файлов - PullRequest
0 голосов
/ 06 марта 2020

Цель: Удалить все файлы в указанном каталоге c, включая файлы во вложенных папках.

Проблема: Удаление самого каталога не приводит к работать, как это возвращает ошибку:

Исключение: указанный BLOB-объект не существует

Моя Azure структура хранения BLOB-объектов может выглядеть следующим образом:

AzureFileStorageAccount
  AzureContainerName
    /themes
      /irrelevantstuff
    /images
      /a
        1.jpg
      /b
        /thumb
          1thumb.png
      /c
        4.jpg
      6.jpg
      9.jpg
      10.jpg

Я не знаю, каково какое-либо из имен папок, но для конечного результата я хочу получить стек / список всех фактических файлов , найденных в данном каталоге.

Например, взяв каталог images:

/images/a/1.jpg
/images/b/thumb/1thumb.png
/images/c/4.jpg
/images/6.jpg
/images/9.jpg
/images/10.jpg

Затем удалите все из них.


Вот моя попытка решение ..

LoadInitialDirectory функция:

public static void LoadInitialDirectory() {
    string initialDirectory = "images";

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
    CloudBlobClient client = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference(azureContainerName);
    CloudBlobDirectory directory = container.GetDirectoryReference(initialDirectory);

    var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
    foreach(var blob in blobs.Results)
    {
        var b = new CloudBlob(blob.Uri);
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
        if (blockBlob.Exists()) {
            // I will assume this is a file
            ProcessFile(blockBlob.Uri);
        }
        else {
            // This is another directory
            ProcessDirectory(blockBlob.Uri);
        }
    }
}

ProcessDirectory функция:

public static void ProcessDirectory(string innerDirectory) {
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
    CloudBlobClient client = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference(azureContainerName);
    CloudBlobDirectory directory = container.GetDirectoryReference(innerDirectory);

    var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
    foreach(var blob in blobs.Results)
    {
        var b = new CloudBlob(blob.Uri);
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
        if (blockBlob.Exists()) {
            ProcessFile(blockBlob.Uri);
        }
        else {
            ProcessDirectory(blockBlob.Uri);
        }
    }
}

ProcessFile function:

public static void ProcessFile(string innerDirectory) {
    myStack.push(innerDirectory);
}

В конце этого у меня должен быть стек строк Uri BLOB-объектов, через которые я могу перебирать и удалять с помощью метода DeleteAsync, поэтому удалите начальный каталог.

Это кажется излишним. У кого-нибудь есть идеи для более компактных, простых решений?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Следует отметить одну вещь: в хранилище BLOB-объектов каталог (и подкаталог) фактически рассматривается как часть имени BLOB-объекта. Если вы удалите все большие двоичные объекты в каталоге, каталог будет удален автоматически.

Способ удаления всех больших двоичных объектов в каталоге (и его подкаталогах) состоит в том, чтобы перечислить все большие двоичные объекты, а затем удалить blob один за другим.

Предположим, вы используете этот пакет хранилища больших двоичных объектов Microsoft. Azure .Storage.Blob, версия 11.1.3 , тогда вы можете использовать метод blobDirectory.ListBlobs() и установите параметр useFlatBlobListing as true, который позволит вам перебирать все большие двоичные объекты в указанном каталоге (а также в подкаталогах).

Пример кода такой, как показано ниже, и он работает для меня:

        var conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxxxxx;EndpointSuffix=core.windows.net";
        var myContainer = "aaa";
        var myDirectory = "images";

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(conn_str);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer blobContainer = blobClient.GetContainerReference(myContainer);
        CloudBlobDirectory blobDirectory = blobContainer.GetDirectoryReference(myDirectory);

        //set useFlatBlobListing as true, so you can list all the blobs in the directory(and it's sub-directories)
        var blobs = blobDirectory.ListBlobs(useFlatBlobListing: true);

        //iterate through all the blobs in the specified directory(and it's sub-directories)
        foreach (var myblob in blobs)
        {
            var b = (CloudBlockBlob)myblob;

            //print out some properties of the blob, just for testing purpose.
            Console.WriteLine(b.Name);
            Console.WriteLine(b.Uri);
            Console.WriteLine("***********");

            //delete the blob
            b.Delete();
        }
0 голосов
/ 06 марта 2020

Если это можно сделать из консоли, я настоятельно рекомендую использовать azure CLI и команду az storage blob delete-batch.

См. Это для получения дополнительной информации. https://docs.microsoft.com/en-us/cli/azure/storage/blob?view=azure-cli-latest#az -Хранение-блоб-удаление-партия

...