जाँच करें कि क्या Azure Storage में एक बूँद मौजूद है


131

मुझे एक बहुत ही सरल प्रश्न मिला है (मुझे आशा है!) - मैं सिर्फ यह पता लगाना चाहता हूं कि क्या एक बूँद (एक नाम जिसे मैंने परिभाषित किया है) एक विशेष कंटेनर में मौजूद है। मैं इसे डाउनलोड कर रहा हूँ अगर यह मौजूद है, और अगर यह नहीं है तो मैं कुछ और करूँगा।

मैंने इंटरब्यूटेस पर कुछ खोज की है और जाहिर तौर पर इसमें एक फ़ंक्शन हुआ करता था जिसका नाम DoExist या कुछ समान है ... लेकिन एज़्योर एपीआई के इतने सारे के साथ, यह अब नहीं लगता है (या यदि यह है, तो एक है बहुत चतुराई से प्रच्छन्न नाम)।


सबको धन्यवाद। जैसा कि मैं StorageClient का उपयोग कर रहा हूं (और उस लाइब्रेरी से गुजरने वाली अपनी सभी एज़्योर स्टोरेज एक्सेस को रखना पसंद करूंगा) मैं FetchAttributes-and-check-for-अपवाद विधि के साथ गया था जो smarx ने सुझाया था। यह थोड़ा सा 'महसूस' करता है, इसमें मुझे अपने व्यावसायिक तर्क के सामान्य भाग के रूप में फेंके गए अपवादों को पसंद नहीं है - लेकिन उम्मीद है कि यह भविष्य में स्टोरेजक्लिक संस्करण में तय किया जा सकता है :)
जॉन

जवाबों:


202

नए API में .Exists () फ़ंक्शन कॉल है। बस सुनिश्चित करें कि आप इसका उपयोग करते हैं GetBlockBlobReference, जो सर्वर पर कॉल नहीं करता है। यह फ़ंक्शन को जितना आसान बनाता है:

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

6
वहाँ है .. एक ... अजगर संस्करण?
अपरेल

2
आश्चर्य है कि बूँद की जाँच के लिए आपसे क्या शुल्क लिया जाता है? यह डिफो बूँद डाउनलोड करने के प्रयास की तुलना में जाने के लिए एक बेहतर तरीका है।
डरमफ्रेंच

10
@anpatel, python संस्करण:len(blob_service.list_blobs(container_name, file_name)) > 0
RaSi

3
आप अपने उत्तर को अपडेट कर सकते हैं जिसके साथ nuget पैकेज स्थापित किया जाना चाहिए
बैटमेसी

9
नोट: Microsoft.WindowsAzure.Storage संस्करण 8.1.4.0 (.Net फ्रेमवर्क v4.6.2) के रूप में Exists () विधि ExistsAsync () के पक्ष में मौजूद नहीं है। जो संस्करण .NetCore प्रोजेक्ट्स के लिए इंस्टॉल करेगा
एडम हार्डी।

49

नोट: यह उत्तर अब पुराना है। कृपया अस्तित्व के लिए जाँचने के आसान तरीके के लिए रिचर्ड का जवाब देखें

नहीं, आप कुछ सरल याद नहीं कर रहे हैं ... हमने नई StorageClient लाइब्रेरी में इस पद्धति को छिपाने का अच्छा काम किया। :)

मैंने आपके प्रश्न का उत्तर देने के लिए सिर्फ एक ब्लॉग पोस्ट लिखी है: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob

संक्षिप्त उत्तर है: CloudBlob.FetchAttributes () का उपयोग करें, जो बूँद के खिलाफ एक HEAD अनुरोध करता है।


1
FetchAttributes () को चलाने में लंबा समय लगता है (कम से कम डेवलपमेंट स्टोरेज में) अगर फाइल अभी तक पूरी तरह से कमिट नहीं हुई है, यानी इसमें सिर्फ अनकम्फर्ड ब्लॉक हैं।
टॉम रॉबिन्सन

7
यदि आप वैसे भी ओपी जैसी करने का इरादा रखते हैं, तो आप ब्लूब को लाने जा रहे हैं, क्यों न कोशिश करें और सामग्री को तुरंत डाउनलोड करें? अगर यह वहाँ नहीं है तो यह फेचअवेटेज की तरह फेंक देगा। इस चेक को पहले करना केवल एक अतिरिक्त अनुरोध है, या क्या मुझे कुछ याद आ रहा है?
मार्निक्स वैन वैलेन

मार्निक्स एक उत्कृष्ट बिंदु बनाता है। यदि आप इसे वैसे भी डाउनलोड करने जा रहे हैं, तो बस इसे डाउनलोड करने का प्रयास करें।
user94559

@ मार्निक्स: यदि आप किसी चीज को कॉल करते हैं तो OpenReadवह खाली स्ट्रीम या उस तरह की किसी चीज को फेंक या वापस नहीं करेगा। जब आप इससे डाउनलोड करना शुरू करेंगे, तो आपको केवल त्रुटियाँ मिलेंगी। यह सब एक जगह पर संभालना बहुत आसान है :)
porges

1
@Porges: क्लाउड एप्लिकेशन डिज़ाइन करना "विफलता के लिए डिज़ाइन" के बारे में है। इस स्थिति को ठीक से संभालने के लिए बहुत सारी चर्चाएं हैं। लेकिन सामान्य तौर पर - मैं भी बस इसे डाउनलोड करूंगा, फिर लापता ब्लॉब त्रुटियों को संभालूंगा। इतना ही नहीं, लेकिन अगर मैं अस्तित्व के लिए जाँच करने के लिए जा रहा हूँ हर बूँद मैं भंडारण लेनदेन की संख्या में वृद्धि कर रहा हूँ, इस प्रकार मेरा बिल। आपके पास अपवाद / त्रुटियों को संभालने के लिए अभी भी एक जगह हो सकती है।
Astaykov

16

सीम लंगड़ा है कि आप इसे बूँद मौजूद है का परीक्षण करने के लिए एक अपवाद को पकड़ने की जरूरत है।

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

9

यदि आप सार्वजनिक हैं, तो निश्चित रूप से, बस किसी भी HTTP HEAD रिक्वेस्ट को भेजें - किसी भी भाषा / वातावरण / प्लेटफ़ॉर्म के किसी भी ज़िलियन से, जो यह जानता है कि कैसे - और प्रतिक्रिया की जाँच करें।

मुख्य एज़्योर एपीआई रेस्टफुल एक्सएमएल-आधारित HTTP इंटरफेस हैं। StorageClient पुस्तकालय उनके आसपास के कई संभावित रैपरों में से एक है। यहाँ एक और बात है जो श्रीराम कृष्णन ने अजगर में की थी:

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

यह यह भी दर्शाता है कि HTTP स्तर पर कैसे प्रमाणित किया जाए।

मैंने C # में अपने लिए एक समान काम किया है, क्योंकि मैं Azure को HTTP / REST के लेंस के बजाय StorageClient लाइब्रेरी के लेंस के माध्यम से देखना पसंद करता हूं। काफी समय से मैंने एक्सिस्टब्लो विधि को लागू करने की जहमत नहीं उठाई। मेरे सभी ब्लब्स सार्वजनिक थे, और HTTP HEAD करना तुच्छ था।


5

नई Windows Azure संग्रहण लाइब्रेरी में पहले से ही मौजूद है () विधि। यह Microsoft में है। WindowsAzure.Storage.dll।

द्वारा उपलब्ध के रूप में उपलब्ध NuGet पैकेज
: Microsoft
Id: WindowsAzure.Storage
संस्करण: 2.0.5.1

Msdn भी देखें


2

यदि आप अपवाद विधि का उपयोग करना पसंद नहीं करते हैं, तो जो जज सुझाव देता है उसका मूल c # संस्करण नीचे है। हालांकि सावधान रहें कि आपको वास्तव में अन्य संभावित प्रतिक्रियाओं को भी संभालना चाहिए।

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

4
HttpWebRequest.GetResponse एक अपवाद फेंकता है अगर कोई 404 है। तो मैं यह नहीं देखता कि आपका कोड अपवादों को संभालने की आवश्यकता को कैसे दरकिनार करेगा?
निट्रामक

निष्पक्ष बिंदु। मुझे लगता है कि GetResponse () उस बिंदु पर फेंकता है! मुझे उम्मीद है कि यह 404 को वापस कर देगा क्योंकि यह प्रतिक्रिया है !!!
मैड पियरे

2

यदि आपकी बूँद सार्वजनिक है और आपको सिर्फ मेटाडेटा की आवश्यकता है:

        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


1

यह मैं ऐसा कर रहा हूं। जिन लोगों को इसकी जरूरत है, उनके लिए पूरा कोड दिखाना।

        // 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.
        }

1

यद्यपि यहां अधिकांश उत्तर तकनीकी रूप से सही हैं, अधिकांश कोड नमूने सिंक्रोनस / ब्लॉकिंग कॉल कर रहे हैं। जब तक आप किसी बहुत पुराने प्लेटफ़ॉर्म या कोड आधार से बंधे नहीं होते हैं, HTTP कॉल हमेशा असंगत रूप से की जानी चाहिए , और एसडीके इस मामले में पूरी तरह से इसका समर्थन करता है। के ExistsAsync()बजाय का उपयोग करें Exists()

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

आप सही हैं, पुराना .Exists () सबसे अच्छा विकल्प नहीं है। हालाँकि, जबकि पुराना API सिंक्रोनस है, प्रतीक्षारत कारणों से ExistAsync भी सिंक्रोनस हो सकता है। इसलिए, मैं सहमत हूं कि HTTP कॉल आमतौर पर अतुल्यकालिक होनी चाहिए । लेकिन यह कोड ऐसा नहीं है। फिर भी, नए एपीआई के लिए +1!
रिचर्ड

2
धन्यवाद, लेकिन मैं इससे अधिक असहमत नहीं हो सकता। Exists()इसमें समकालिक है कि यह एक थ्रेड को ब्लॉक करता है जब तक कि यह पूरा नहीं हो जाता। await ExistsAscyn()में अतुल्यकालिक है कि यह नहीं करता है। दोनों एक ही तार्किक प्रवाह का अनुसरण करते हैं कि कोड की अगली पंक्ति तब तक शुरू नहीं होती है जब तक कि पिछले एक को पूरा नहीं किया जाता है, लेकिन यह गैर-प्रकृति है ExistsAsyncजो इसे अतुल्यकालिक बनाती है।
टोड मेनियर

1
और ... मैंने कुछ नया सीखा है! :) softwareengineering.stackexchange.com/a/183583/38547
रिचर्ड

1

यदि आप अन्य समाधान पसंद नहीं करते हैं, तो यहां एक अलग समाधान है:

मैं Azure.Storage.Blobs NuGet पैकेज के संस्करण 12.4.1 का उपयोग कर रहा हूं।

मुझे एक Azure.Pageable ऑब्जेक्ट मिलता है जो एक कंटेनर में सभी ब्लब्स की एक सूची है। मैं तब जाँचता हूं कि अगर BlobItem का नाम LINQ के उपयोग वाले कंटेनर के अंदर प्रत्येक बूँद के नाम की संपत्ति के बराबर है । (यदि सब कुछ मान्य है, तो निश्चित रूप से)

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Linq;
using System.Text.RegularExpressions;

public class AzureBlobStorage
{
    private BlobServiceClient _blobServiceClient;

    public AzureBlobStorage(string connectionString)
    {
        this.ConnectionString = connectionString;
        _blobServiceClient = new BlobServiceClient(this.ConnectionString);
    }

    public bool IsContainerNameValid(string name)
    {
        return Regex.IsMatch(name, "^[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]$", RegexOptions.Singleline | RegexOptions.CultureInvariant);
    }

    public bool ContainerExists(string name)
    {
        return (IsContainerNameValid(name) ? _blobServiceClient.GetBlobContainerClient(name).Exists() : false);
    }

    public Azure.Pageable<BlobItem> GetBlobs(string containerName, string prefix = null)
    {
        try
        {
            return (ContainerExists(containerName) ? 
                _blobServiceClient.GetBlobContainerClient(containerName).GetBlobs(BlobTraits.All, BlobStates.All, prefix, default(System.Threading.CancellationToken)) 
                : null);
        }
        catch
        {
            throw;
        }
    }

    public bool BlobExists(string containerName, string blobName)
    {
        try
        {
            return (from b in GetBlobs(containerName)
                     where b.Name == blobName
                     select b).FirstOrDefault() != null;
        }
        catch
        {
            throw;
        }
    }
}

उम्मीद है कि यह भविष्य में किसी की मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.