2015-05-15 5 views
8

Azure blob फ़ाइलों को किसी भी भौतिक फ़ोल्डर संरचना के बिना एक सादे सूची में संग्रहीत किया जाता है, लेकिन हम वर्चुअल फ़ोल्डर्स बना सकते हैं जहां प्रत्येक फ़ाइल का फ़ोल्डर पथ इसके नाम का हिस्सा होता है।अज़ूर ब्लॉब फ़ाइलों की सूची को फिर से लोड कैसे करें?

यह एक और समस्या लाता है, वर्चुअल उप-फ़ोल्डर में सभी फ़ाइलों की सूची को पुनर्प्राप्त करने के लिए, केवल उस फ़ोल्डर के नाम का उपयोग करके?

उत्तर

19

वास्तव में, ऐसा करने के लिए एक सरल तरीका है और यह पुस्तकालय अपने आप में उपलब्ध है।

  1. उपसर्ग: आप CloudBlobContainer.ListBlobs विधि को देखें, तो यह दो पैरामीटर स्वीकार यह आपके निर्देशिका का नाम है। यदि यह एक नेस्टेड निर्देशिका है, तो आपको पूर्ण पथ निर्दिष्ट करना होगा। MyFolder/mysubfolder।
  2. useFlatBlobListing: true को यह मूल्य निर्धारित करना सुनिश्चित करेंगे कि केवल धब्बे लौटा दिया जाता है नहीं और निर्देशिका और धब्बे (उस निर्देशिका के अंदर किसी भी उप फ़ोल्डर के अंदर सहित)।

    var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); 
        var blobClient = account.CreateCloudBlobClient(); 
        var container = blobClient.GetContainerReference("blob-container-name"); 
        var blobs = container.ListBlobs(prefix: "container-directory", useFlatBlobListing: true); 
    

आप blobs चर में "कंटेनर-निर्देशिका" में संबंधित सभी धब्बे की एक सूची मिल जाएगा।

+0

जो बहुत आसान लगती है, मैं इसे आज़माउंगा !! साझा करने के लिए धन्यवाद –

8

यह स्थैतिक वर्ग BlobHelper किसी दिए गए ब्लॉब फ़ोल्डर में सभी ब्लॉब फ़ाइलों की सूची लोड करेगा, और इसके सभी उप-फ़ोल्डर।

बस इस तरह इसे कहते:

var blobs = BlobHelper.ListFolderBlobs("blob-container-name", "container-directory"); 

यहाँ पूर्ण BlobHelper कोड है:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using Microsoft.WindowsAzure; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Blob; 

// Class to contain list of blob files info 
public class BlobFileInfo { 
    public string FileName { get; set; } 
    public string BlobPath { get; set; } 
    public string BlobFilePath { get; set; } 
    public IListBlobItem Blob { get; set; } 
} 
public static class BlobHelper { 
// Load blob container 
public static CloudBlobContainer GetBlobContainer(string containerName) { 
    var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    var blobClient = storageAccount.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference(containerName); 
    return container; 
} 

// Get recursive list of files 
public static IEnumerable<BlobFileInfo> ListFolderBlobs(string containerName, string directoryName) { 
    var blobContainer = GetBlobContainer(containerName); 
    var blobDirectory = blobContainer.GetDirectoryReference(directoryName); 
    var blobInfos = new List<BlobFileInfo>(); 
    var blobs = blobDirectory.ListBlobs().ToList(); 
    foreach (var blob in blobs) { 
    if (blob is CloudBlockBlob) { 
     var blobFileName = blob.Uri.Segments.Last().Replace("%20", " "); 
     var blobFilePath = blob.Uri.AbsolutePath.Replace(blob.Container.Uri.AbsolutePath + "/", "").Replace("%20", " "); 
     var blobPath = blobFilePath.Replace("/" + blobFileName, ""); 
     blobInfos.Add(new BlobFileInfo { 
     FileName = blobFileName, 
     BlobPath = blobPath, 
     BlobFilePath = blobFilePath, 
     Blob = blob 
     }); 
    } 
    if (blob is CloudBlobDirectory) { 
     var blobDir = blob.Uri.OriginalString.Replace(blob.Container.Uri.OriginalString + "/", ""); 
     blobDir = blobDir.Remove(blobDir.Length - 1); 
     var subBlobs = ListFolderBlobs(containerName, blobDir); 
     blobInfos.AddRange(subBlobs); 
    } 
    } 
    return blobInfos; 
} 
} 
+0

इस के लिए धन्यवाद, लेकिन क्या accountSlug मतलब है? मुझे वहां अपवाद मिलता है। – Craig

+0

@ क्रैग, मेरा मानना ​​है कि इसके बजाय 'कंटेनरनाम' होना चाहिए, मुझे यह सही मिला, अब इसे काम करना चाहिए। यह उत्तर भी देखें, इसमें भी आसान समाधान हो सकता है: http://stackoverflow.com/a/30272025/448816। –

+0

धन्यवाद, यह काम कर रहा है। हालांकि यह केवल एक निर्देशिका सूचीबद्ध करता है। एक पूर्ण पेड़, शीर्ष से नीचे, लिस्टिंग के लिए खोज रहे हैं। अब इसे रेजर में बदलने की कोशिश कर रहा है: http://www.codeproject.com/Articles/597939/ModelingplusaplusDirectoryplusStructureplusonplusA। फिर से धन्यवाद। – Craig

0

गौरव मंत्री के उत्तर से, यहां पदानुक्रम के रूप में फ़ाइलों को बार-बार दिखाने का एक आसान तरीका है।

public class UriNode 
{ 
    public Uri ThisUri { get; private set; } 

    public IEnumerable<UriNode> Children { get; private set; } 

    public UriNode(CloudBlobContainer container, Uri thisUri = null) 
    { 
     ThisUri = thisUri; 

     if (ThisUri == null) 
     { 
      Children = container.ListBlobs().Select(b => new UriNode(container, b.Uri)); 
      return; 
     } 

     if (!new Regex(@"\/$").IsMatch(ThisUri.AbsolutePath)) return; 

     var prefix = string.Join("/", ThisUri.Segments.Skip(2).Take(ThisUri.Segments.Length - 2)); 
     Children = container.ListBlobs(prefix).Select(b => new UriNode(container, b.Uri)); 
    } 
} 

उपयोग:

new UriNode(container); 
संबंधित मुद्दे