2012-06-14 10 views
9

Ich möchte überprüfen, ob eine bestimmte Datei in Azure Blob Storage vorhanden ist. Ist es möglich, den Dateinamen zu überprüfen? Jedes Mal, wenn ich File Not Found Error bekam.So überprüfen Sie, ob eine Azure Blob-Datei vorhanden ist oder nicht

+0

Ich denke, diese Frage ist ein Duplikat von diesem http://stackoverflow.com/questions/2642919/checking-if-a-blob-exists-in-azure-storage Überprüfen Sie es. –

Antwort

14

sollte diese Erweiterung Methode Ihnen helfen:

public static class BlobExtensions 
{ 
    public static bool Exists(this CloudBlob blob) 
    { 
     try 
     { 
      blob.FetchAttributes(); 
      return true; 
     } 
     catch (StorageClientException e) 
     { 
      if (e.ErrorCode == StorageErrorCode.ResourceNotFound) 
      { 
       return false; 
      } 
      else 
      { 
       throw; 
      } 
     } 
    } 
} 

Verbrauch:

static void Main(string[] args) 
{ 
    var blob = CloudStorageAccount.DevelopmentStorageAccount 
     .CreateCloudBlobClient().GetBlobReference(args[0]); 
    // or CloudStorageAccount.Parse("<your connection string>") 

    if (blob.Exists()) 
    { 
     Console.WriteLine("The blob exists!"); 
    } 
    else 
    { 
     Console.WriteLine("The blob doesn't exist."); 
    } 
} 

http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob

+3

Ausnahmen können teuer sein ... –

+0

Ja, aber ich glaube nicht, dass es eine andere Möglichkeit gibt, nach der Existenz des Blobs zu suchen. –

+2

Hinweis: Dies funktioniert nicht mehr mit dem neuen SDK. Die anderen Antworten sind die Lösung. – Tincan

7

Mit dem aktualisierten SDK, sobald Sie die CloudBlobReference Sie auf exists() anrufen können Ihre Referenz.

UPDATE

Die entsprechende Dokumentation ist https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblob.exists?view=azurestorage-8.1.3#Microsoft_WindowsAzure_Storage_Blob_CloudBlob_Exists_Microsoft_WindowsAzure_Storage_Blob_BlobRequestOptions_Microsoft_WindowsAzure_Storage_OperationContext_

Meine Implementierung mit WindowsAzure.Storage v2.0.6.1

private CloudBlockBlob GetBlobReference(string filePath, bool createContainerIfMissing = true) 
    { 
     CloudBlobClient client = _account.CreateCloudBlobClient(); 
     CloudBlobContainer container = client.GetContainerReference("my-container"); 

     if (createContainerIfMissing && container.CreateIfNotExists()) 
     { 
      //Public blobs allow for public access to the image via the URI 
      //But first, make sure the blob exists 
      container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 
     } 

     CloudBlockBlob blob = container.GetBlockBlobReference(filePath); 

     return blob; 
    } 

    public bool Exists(String filepath) 
    { 
     var blob = GetBlobReference(filepath, false); 
     return blob.Exists(); 
    } 
+2

aber es gibt immer falsch zurück. Wer hat das gleiche Problem? –

+0

Überprüfen Sie die Sichtbarkeit Ihres Buckets und der Datei selbst. Wenn es öffentlich sichtbar ist, versuchen Sie es über einen Browser. Möglicherweise ist Ihre URI nicht korrekt. –

+0

Ich bekomme den Namen mit .ListBlobs() auf der gleichen BlobService-Instanz, daher sollte es kein Sichtbarkeits-/Berechtigungsproblem sein. –

18
var blob = client.GetContainerReference(containerName).GetBlockBlobReference(blobFileName); 

if (blob.Exists()) 
//do your stuff 
+8

Versuchen Sie es Fügen Sie einen Kontext für Ihren Code hinzu, um der Person zu helfen, die die Frage stellt. –

1

Mit Microsoft verschoben. WindowsAzure.Storage.Blob ve rsion 4.3.0.0, der folgende Code sollte funktionieren (es gibt eine Menge brechender Änderungen mit älteren Versionen dieser Baugruppe):

Verwendung des Container-/Blob-Namens und der angegebenen API (scheint jetzt von Microsoft tatsächlich implementiert worden zu sein) :

return _blobClient.GetContainerReference(containerName).GetBlockBlobReference(blobName).Exists(); 

Mit Blob URI (Abhilfe):

try 
    { 
     CloudBlockBlob cb = (CloudBlockBlob) _blobClient.GetBlobReferenceFromServer(new Uri(url)); 
     cb.FetchAttributes(); 
    } 
    catch (StorageException se) 
    { 
     if (se.Message.Contains("404") || se.Message.Contains("Not Found")) 
     { 
      return false; 
     } 
    } 
    return true; 

(Fetch Attribute fehl, wenn der Blob bestehende nicht. Dirty, ich weiß :)

+0

@Steve, hilft das? Welche Version des Storage-Clients verwenden Sie? –

Verwandte Themen