wake-up-neo.com

So löschen Sie einen Ordner in einem Azure-Blob-Container

Ich habe in Azure einen Blob-Container namens pictures, der verschiedene Ordner enthält (siehe Momentaufnahme unten):

 enter image description here

Ich versuche, die im Snapshot angezeigten Ordner users und uploads zu löschen, aber ich behalte den Fehler: Failed to delete blob pictures/uploads/. Error: The specified blob does not exist. Kann jemand etwas darüber herausfinden, wie ich diese beiden Ordner löschen kann? Ich konnte nichts Wichtiges über Googling dieses Problem aufdecken.

Hinweis: Bitte fragen Sie mich nach weiteren Informationen, falls Sie es benötigen

13
Hassan Baig

Windows Azure Blob Storage verfügt nicht über das Konzept von Ordnern. Die Hierarchie ist sehr einfach: Speicherkonto> Container> BLOB . Beim Entfernen eines bestimmten Ordners werden tatsächlich alle Blobs entfernt, die mit dem Ordnernamen beginnen. Sie können den einfachen Code wie folgt schreiben, um Ihre Ordner zu löschen:

        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 ("Benutzer"). ListBlobs (true) listet die Blobs auf, die mit "Benutzer" innerhalb des "Picture" -Containers beginnen. Sie können sie dann einzeln löschen. Um andere Ordner zu löschen, müssen Sie nur Folgendes angeben: GetDirectoryReference ("Ihr Ordnername").

19
forester123

Das liegt daran, dass die "Ordner" nicht wirklich existieren. In einem Azure-Speicherkonto haben Sie Container, die mit Blobs gefüllt sind. Was von Clients als "Ordner" angezeigt wird, sind die Dateinamen der Blobs im Konto "Bilder/Uploads /". Wenn Sie den "Ordner" entfernen möchten, müssen Sie tatsächlich alle Blobs entfernen, die den gleichen "Pfad" haben. 

Am gebräuchlichsten ist es, eine Liste dieser Blobs abzurufen und diese dann dem Löschblob-Aufruf zuzuführen. 

8

Beginnen wir mit einem Beispiel, wie ein "Ordner" mit ListBlobsSegmentedAsyc gelöscht wird:

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);

Was es macht...

var ctoken = new BlobContinuationToken();

Ein "Ordner" kann viele Dateien enthalten. ListBlobSegmentedAsyc gibt möglicherweise nur einen Teil davon zurück. Dieses Token speichert die Informationen, wo der nächste Anruf erfolgen soll.

var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
  • Das erste Argument ist das erforderliche Präfix für den Blobnamen ("Pfad").
  • Das zweite Argument "useFlatBlobListing = true" weist den Client an, alle Elemente in allen Unterordnern zurückzugeben. Bei Festlegung auf "false" wird es im Modus "virtuelle Ordner" ausgeführt und verhält sich wie ein Dateisystem.
  • Das Ctoken teilt Azure mit, wo es fortfahren soll

Für alle Argumente siehe https://docs.Microsoft.com/de-de/dotnet/api/Microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=Azure-dotnet für Details.

(item as CloudBlob)?.DeleteIfExistsAsync()

Jetzt haben wir eine Liste von IListBlobItem in result.Results. Da es sich nicht garantiert ist, dass ein IListBlobItem ein löschbarer CloudBlob ist (wenn es beispielsweise useFlatBlobListing = false gesetzt hätte, könnte dies ein virtueller Ordner sein), versuchen wir, ihn umzuwandeln und wenn möglich zu löschen.

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

Löscht alle Ergebnisse und löscht eine Liste mit Aufgaben.

.Where(task => task != null)

Wenn Ergebnisse Elemente enthielten, die wir nicht in CloudBlob konvertieren konnten, enthält unsere Aufgabenliste Nullwerte. Wir müssen sie entfernen.

... dann warten wir, bis alle Löschvorgänge für das aktuelle Segment abgeschlossen sind, und fahren mit dem nächsten Segment fort, sofern verfügbar.

3

Es gibt auch einen Desktop Storage Explorer von Microsoft. Es verfügt über eine Funktion, mit der Sie den virtuellen Ordner auswählen und anschließend löschen können. Dabei werden alle Unterblobs effektiv gelöscht. 

https://Azure.Microsoft.com/de-de/features/storage-Explorer/

1
stueynet

Jetzt können Sie mithilfe der Lebenszyklusverwaltung Dateien mit dem Präfix Match und Aktionen mit der Eigenschaft daysAfterModificationGreaterThan löschen. Lassen Sie die Regel etwa 24 Stunden lang aktiv. Und es wird den Job machen. Dokumentation zum Lifecycle Management unter https://docs.Microsoft.com/en-us/Azure/storage/blobs/storage-lifecycle-management-concepts

0
nitzien

enter image description here Sie können jetzt die Löschaktivität in ADF verwenden, um alle Dateien/Blobs zu löschen. Es werden alle darin enthaltenen Dateien gelöscht

0
Rajat