web-dev-qa-db-fra.com

Comment supprimer un dossier dans un conteneur de blob Azure

J'ai un conteneur d'objets blob dans Azure appelé pictures qui contient divers dossiers (voir la capture instantanée ci-dessous):

 enter image description here

J'essaie de supprimer les dossiers intitulés users et uploads affichés dans l'instantané, mais je garde l'erreur: Failed to delete blob pictures/uploads/. Error: The specified blob does not exist. Quelqu'un peut-il nous éclairer sur la manière dont je peux supprimer ces deux dossiers? Je n'ai pas été en mesure de découvrir quelque chose de significatif via Google ce problème.

Remarque: demandez-moi plus d'informations au cas où vous en auriez besoin

13
Hassan Baig

Windows Azure Blob Storage n'a pas le concept de dossiers. La hiérarchie est très simple: compte de stockage> conteneur> blob . En fait, supprimer un dossier particulier supprime tous les blobs qui commencent par le nom du dossier. Vous pouvez écrire le code simple ci-dessous pour supprimer vos dossiers:

        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 ("utilisateurs"). ListBlobs (true) répertorie les blobs commençant par "utilisateurs" dans le conteneur "picture", vous pouvez ensuite les supprimer individuellement. Pour supprimer d'autres dossiers, il vous suffit de spécifier comme ceci GetDirectoryReference ("votre nom de dossier").

19
forester123

C'est parce que les "dossiers" n'existent pas réellement. Dans un compte de stockage Azure, vous avez des conteneurs remplis de blobs. Ce que vous voyez comme "dossiers" par les clients, ce sont les noms de fichiers des blobs dans le compte "pictures/uploads /". Si vous souhaitez supprimer le "dossier", vous devez supprimer chacun des blobs portant le même "chemin". 

L'approche la plus courante consiste à obtenir une liste de ces blobs, puis à l'envoyer à l'appel de suppression de blob. 

8
BrentDaCodeMonkey

Commençons par un exemple sur la manière de supprimer un "dossier" à l'aide de 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);

Ce qu'il fait...

var ctoken = new BlobContinuationToken();

Un "dossier" peut contenir beaucoup de fichiers. ListBlobSegmentedAsyc peut ne renvoyer qu'une partie d'entre eux. Ce jeton stockera l'information où continuer dans le prochain appel.

var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
  • Le premier argument est le préfixe de nom d'objet ("chemin") requis.
  • Le deuxième argument "useFlatBlobListing = true" indique au client de renvoyer tous les éléments de tous les sous-dossiers. Si la valeur est false, il s'exécutera en mode "dossiers virtuels" et se comportera comme un système de fichiers.
  • Le ctoken dira à Azure où continuer

Pour tous les arguments, voir https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=Azure-dotnet pour plus de détails.

(item as CloudBlob)?.DeleteIfExistsAsync()

Nous avons maintenant une liste de IListBlobItem dans result.Results. Comme il n'est pas garanti qu'un IListBlobItem soit un CloudBlob supprimable (par exemple, il pourrait s'agir d'un dossier virtuel si nous aurions défini useFlatBlobListing = false), nous essayons de le convertir et de le supprimer si possible.

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

Les déclencheurs suppriment tous les résultats et renvoient une liste de tâches.

.Where(task => task != null)

Si les résultats contenaient des éléments que nous ne pouvions pas attribuer à CloudBlob, notre liste de tâches contient des valeurs null. Nous devons les enlever.

... puis nous attendons la fin de la suppression du segment en cours et poursuivons avec le segment suivant, le cas échéant.

3
Christoph Lütjen

Il existe également un explorateur de stockage de bureau de Microsoft. Il possède une fonctionnalité dans laquelle vous pouvez sélectionner le dossier virtuel, puis le supprimer, en supprimant efficacement tous les sous-objets blob. 

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

1
stueynet