سؤال

لدي سؤال بسيط للغاية (آمل!) - أريد فقط معرفة ما إذا كان هناك Blob (مع اسم حددته) موجود في حاوية معينة. سأقوم بتنزيله إذا كان موجودًا ، وإذا لم يحدث ذلك ، فسوف أفعل شيئًا آخر.

لقد قمت ببعض البحث على الأنابيب ، ويبدو أنه كان هناك وظيفة تسمى doesexist الاسم المتنكر بذكاء جدا).

هل كانت مفيدة؟

المحلول

يحتوي API الجديد على استدعاء وظيفة .exists (). فقط تأكد من استخدامك GetBlockBlobReference, ، والتي لا تؤدي المكالمة إلى الخادم. يجعل الوظيفة سهلة مثل:

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}

نصائح أخرى

ملاحظة: هذه الإجابة قديمة الآن. يرجى الاطلاع على إجابة ريتشارد للحصول على طريقة سهلة للتحقق من الوجود

لا ، أنت لا تفتقد شيئًا بسيطًا ... لقد قمنا بعمل جيد لإخفاء هذه الطريقة في مكتبة StorageClient الجديدة. قون

لقد كتبت للتو منشور مدونة للإجابة على سؤالك: http://blog.smarx.com/posts/testing-existence-of-awindows-azure-lob.

الإجابة المختصرة هي: استخدام cloudblob.fetchattributes () ، والذي يقوم بطلب رأس مقابل النقطة.

يبدو أنك تحتاج إلى التقاط استثناء لاختباره.

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

إذا كانت النقطة عامة ، فيمكنك ، بالطبع ، إرسال طلب HTTP Head - من أي من Zillions من اللغات/البيئات/المنصات التي تعرف كيف تفعل ذلك - والتحقق من الاستجابة.

واجهات برمجة تطبيقات Core Azure هي واجهات HTTP المستندة إلى XML. مكتبة StorageClient هي واحدة من العديد من الأغلفة الممكنة من حولهم. إليكم آخر فعله سريرام كريشنان في بيثون:

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html

كما يوضح كيفية المصادقة على مستوى HTTP.

لقد فعلت شيئًا مشابهًا لنفسي في C#، لأنني أفضل رؤية Azure من خلال عدسة HTTP/REST بدلاً من عدسة مكتبة StorageClient. لفترة طويلة لم أكن قد أزعجت بتنفيذ طريقة موجودة. كانت جميع النقط الخاصة بي عامة ، وكان من المهم أن تفعل HTTP.

تحتوي مكتبة Windows Azure Storage الجديدة بالفعل على طريقة الوجود (). إنه في microsoft.windowsazure.storage.dll.

متاح كحزمة nuget
تم إنشاؤها بواسطة: Microsoft
معرف: Windowsazure.storage
الإصدار: 2.0.5.1

انظر أيضا MSDN

إذا كنت لا تحب استخدام طريقة الاستثناء ، فإن إصدار C# الأساسي لما يقترحه Judell أدناه. احذر على الرغم من أنك يجب أن تتعامل مع الاستجابات الأخرى المحتملة أيضًا.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
    return true;
}
else
{
    return false;
}

باستخدام SDK المحدث ، بمجرد أن يكون لديك CloudBlobReference ، يمكنك الاتصال () موجود () على مرجعك.

يرى http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

هذه هي الطريقة التي أفعل بها. إظهار رمز كامل لأولئك الذين يحتاجون إليها.

        // Parse the connection string and return a reference to the storage account.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("ContainerName");

        // Retrieve reference to a blob named "test.csv"
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.csv");

        if (blockBlob.Exists())
        {
          //Do your logic here.
        }

على الرغم من أن معظم الإجابات هنا صحيحة من الناحية الفنية ، فإن معظم عينات التعليمات البرمجية تقوم بإجراء مكالمات متزامنة/حظر. ما لم تكن ملزماً بمنصة قديمة جدًا أو قاعدة رمز ، يجب أن تكون مكالمات HTTP دائماً يتم تنفيذها بشكل غير متزامن ، ويدعمها SDK بالكامل في هذه الحالة. فقط استخدم ExistsAsync() بدلاً من Exists().

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();

إذا كانت النقطة الخاصة بك عامة وتحتاج إلى بيانات تعريف فقط:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "HEAD";
        string code = "";
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            code = response.StatusCode.ToString();
        }
        catch 
        {
        }

        return code; // if "OK" blob exists
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top