Ich habe eine sehr einfache Frage (ich hoffe!) - ich möchte nur herausfinden, ob ein Blob (mit einem von mir definierten Namen) in einem bestimmten Container vorhanden ist. Ich werde es herunterladen, wenn es existiert, und wenn es nicht existiert, werde ich etwas anderes tun.
Ich habe einige Suchen in den Intertubes durchgeführt und anscheinend gab es früher eine Funktion namens DoesExist oder ähnliches ... aber wie bei so vielen Azure-APIs scheint diese nicht mehr vorhanden zu sein (oder wenn ja, hat sie eine sehr geschickt getarnter Name).
c#
azure
azure-blob-storage
John
quelle
quelle
Antworten:
Die neue API hat den Funktionsaufruf .Exists (). Stellen Sie einfach sicher, dass Sie die verwenden
GetBlockBlobReference
, die den Aufruf des Servers nicht ausführt. Es macht die Funktion so einfach wie:quelle
len(blob_service.list_blobs(container_name, file_name)) > 0
Hinweis: Diese Antwort ist jetzt veraltet. In Richards Antwort finden Sie eine einfache Möglichkeit, die Existenz zu überprüfen
Nein, Sie vermissen nichts Einfaches ... Wir haben diese Methode gut in der neuen StorageClient-Bibliothek versteckt. :) :)
Ich habe gerade einen Blog-Beitrag geschrieben, um Ihre Frage zu beantworten: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
Die kurze Antwort lautet: Verwenden Sie CloudBlob.FetchAttributes (), das eine HEAD-Anforderung für den Blob ausführt.
quelle
OpenRead
wird kein leerer Stream oder ähnliches geworfen oder zurückgegeben. Sie erhalten nur Fehler, wenn Sie mit dem Herunterladen beginnen. Es ist viel einfacher, dies alles an einem Ort zu erledigen :)Scheint lahm, dass Sie eine Ausnahme abfangen müssen, um zu testen, ob der Blob existiert.
quelle
Wenn der Blob öffentlich ist, können Sie natürlich einfach eine HTTP-HEAD-Anfrage senden - von einer der Millionen Sprachen / Umgebungen / Plattformen, die wissen, wie das geht - und die Antwort überprüfen.
Die wichtigsten Azure-APIs sind RESTful XML-basierte HTTP-Schnittstellen. Die StorageClient-Bibliothek ist einer von vielen möglichen Wrappern um sie herum. Hier ist eine andere, die Sriram Krishnan in Python gemacht hat:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Außerdem wird gezeigt, wie Sie sich auf HTTP-Ebene authentifizieren.
Ich habe in C # etwas Ähnliches für mich getan, weil ich Azure lieber durch die Linse von HTTP / REST als durch die Linse der StorageClient-Bibliothek sehe. Eine ganze Weile hatte ich mir nicht einmal die Mühe gemacht, eine ExistsBlob-Methode zu implementieren. Alle meine Blobs waren öffentlich und es war trivial, HTTP HEAD zu machen.
quelle
Die neue Windows Azure-Speicherbibliothek enthält bereits die Exist () -Methode. Es befindet sich in der Microsoft.WindowsAzure.Storage.dll.
Verfügbar als NuGet-Paket
Erstellt von: Microsoft
ID: WindowsAzure.Storage
Version: 2.0.5.1
Siehe auch msdn
quelle
Wenn Sie die Ausnahmemethode nicht gerne verwenden, finden Sie unten die grundlegende c # -Version dessen, was Judell vorschlägt. Beachten Sie jedoch, dass Sie auch mit anderen möglichen Antworten umgehen sollten.
quelle
Wenn Ihr Blob öffentlich ist und Sie nur Metadaten benötigen:
quelle
Mit dem aktualisierten SDK können Sie, sobald Sie die CloudBlobReference haben, Exists () für Ihre Referenz aufrufen.
Siehe http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx
quelle
So mache ich es. Vollständigen Code für diejenigen anzeigen, die ihn benötigen.
quelle
Obwohl die meisten Antworten hier technisch korrekt sind, führen die meisten Codebeispiele synchrone / blockierende Aufrufe durch. Wenn Sie nicht an eine sehr alte Plattform oder Codebasis gebunden sind, sollten HTTP-Aufrufe immer asynchron ausgeführt werden, und das SDK unterstützt dies in diesem Fall vollständig. Verwenden Sie einfach
ExistsAsync()
anstelle vonExists()
.quelle
Exists()
ist insofern synchron, als es einen Thread blockiert, bis er abgeschlossen ist.await ExistsAscyn()
ist insofern asynchron, als dies nicht der Fall ist. Beide folgen dem gleichen logischen Ablauf, da die nächste Codezeile erst beginnt, wenn die vorherige fertig ist, aber es ist die nicht blockierende NaturExistsAsync
, die sie asynchron macht.Hier ist eine andere Lösung, wenn Ihnen die anderen Lösungen nicht gefallen:
Ich verwende Version 12.4.1 des Azure.Storage.Blobs NuGet-Pakets.
Ich erhalte ein Azure.Pageable- Objekt, das eine Liste aller Blobs in einem Container enthält. Ich überprüfe dann mithilfe von LINQ , ob der Name des BlobItem der Name- Eigenschaft jedes Blobs im Container entspricht . (Wenn alles gültig ist, natürlich)
Hoffentlich hilft das jemandem in der Zukunft.
quelle