2012-06-18 9 views
5

¿Alguien puede decirme por qué no podemos crear un contenedor dentro de un contenedor en almacenamiento azul? Y cualquier método para manejar, ¿dónde tenemos que crear una jerarquía de directorios en almacenamiento azul?Azure Containers

Respuesta

14

No puede crear un contenedor en un contenedor porque Windows Azure simplemente no admite contenedores jerárquicos (debe ver un contenedor como una "unidad de disco" como usted C: \ disco). Pero trabajar con directorios es compatible con la clase CloudBlobDirectory. Este es un ejemplo de Neil's blog:

protected void GetDirectoryList(String topLevelDirectoryName, String subDirectoryName) 
{ 
    CloudStorageAccount cloudStorageAccount = 
     CloudStorageAccount.FromConfigurationSetting(“DataConnectionString”); 
    CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient(); 

    CloudBlobDirectory topLevelDirectory = cloudBlobClient.GetBlobDirectoryReferencetopLevelDirectoryName); 

    CloudBlobDirectory subDirectory = topLevelDirectory.GetSubdirectory(subDirectoryName); 

    IEnumerable<IListBlobItem> blobItems = subDirectory.ListBlobs(); 
    foreach (IListBlobItem blobItem in blobItems) 
    { 
     Uri uri = blobItem.Uri; 
    } 
} 
+1

Vale la pena mencionar aquí que la estructura de carpetas como se logra mediante el uso de una barra inversa (\) en los nombres de Blob. Por lo tanto, podemos tener CloudBlobDirectories, que es solo una lista de blobs con el mismo prefijo (es decir, images \ someblob.jpg, images \ otherblob.jpg). Mientras que el nombre completo de una sola burbuja es "images \ someblob.jpg") – astaykov

+3

Corrección al comentario de @ astaykov: se utilizan barras diagonales (/), y esto es solo el predeterminado. La API te permite especificar cualquier delimitador que desees. – smarx

+1

Actualmente no hay función GetBlobDirectoryReference en CloudBlobClient. Para enumerar los contenidos de un directorio, puede usar esta respuesta http://stackoverflow.com/a/25312000/1519458 –

1

A continuación se muestra un código de trabajo para el contenedor azul de mi clase (utilizado para la gestión de burbuja) en un proyecto de trabajo.
PLS y PLS en cuenta que sus nombres de las carpetas en el contenedor y los archivos blob en el contenedor debe estar en letra pequeña o podría tener un error

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Web; 
using Microsoft.WindowsAzure; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Auth; 
using Microsoft.WindowsAzure.Storage.Blob; 

    namespace XXXXXXXXXXX 
{ 

public class Blob 
{ 

    private CloudBlobContainer Prerequisite(string userId) 
    { 
     var con = ConfigurationManager.AppSettings["StorageConnectionString"]; 
     // Retrieve storage account from connection string. 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
      con); 

     // Create the blob client. 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

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

     return container; 
    } 


    public void CreateUserContainerIfNotExisting(string userId) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

     // Create the container if it doesn't already exist. 
     container.CreateIfNotExists(); 

     //Public access to all items in the container (meaning public can see it and download it but not modify and delete it) 
     container.SetPermissions(
      new BlobContainerPermissions 
      { 
       PublicAccess = 
        BlobContainerPublicAccessType.Blob 
      }); 
    } 

    public void ReadFileInBlob(string userId) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

     // Loop over items within the container and output the length and URI. 
     // foreach (IListBlobItem item in container.ListBlobs(null, false)) 
     foreach (IListBlobItem item in container.ListBlobs(null, true)) 
     { 
      if (item.GetType() == typeof(CloudBlockBlob)) 
      { 
       CloudBlockBlob blob = (CloudBlockBlob)item; 

       Console.WriteLine("Block blob of length {0}: {1}", blob.Properties.Length, blob.Uri); 

      } 
      else if (item.GetType() == typeof(CloudPageBlob)) 
      { 
       CloudPageBlob pageBlob = (CloudPageBlob)item; 

       Console.WriteLine("Page blob of length {0}: {1}", pageBlob.Properties.Length, pageBlob.Uri); 

      } 
      else if (item.GetType() == typeof(CloudBlobDirectory)) 
      { 
       CloudBlobDirectory directory = (CloudBlobDirectory)item; 

       Console.WriteLine("Directory: {0}", directory.Uri); 
      } 
     } 
    } 

    public CloudBlockBlob AddOrModifyItemToBlob(string userId, string itemKey) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

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

     return blockBlob; 

    } 

    public void DownloadToFolderLocation(string userId, string itemKey, string location) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

     // Retrieve reference to a blob named "photo1.jpg". 
     CloudBlockBlob blockBlob = container.GetBlockBlobReference(itemKey); 

     // Save blob contents to a file. 
     using (var fileStream = System.IO.File.OpenWrite(location)) 
     { 
      blockBlob.DownloadToStream(fileStream); 
     } 
    } 

    public string DownloadAsStream(string userId, string itemKey) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

     // Retrieve reference to a blob named "myblob.txt" 
     CloudBlockBlob blockBlob2 = container.GetBlockBlobReference(itemKey); 

     string text; 
     using (var memoryStream = new MemoryStream()) 
     { 
      blockBlob2.DownloadToStream(memoryStream); 
      text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); 
     } 
     return text; 
    } 

    public void DeleteBlobFile(string userId, string itemKey) 
    { 
     CloudBlobContainer container = Prerequisite(userId); 

     // Retrieve reference to a blob named "myblob.txt". 
     CloudBlockBlob blockBlob = container.GetBlockBlobReference(itemKey); 

     // Delete the blob. 
     blockBlob.Delete(); 
    } 

    } 
    } 
1

La forma más sencilla de crear un contenedor dentro de otro contenedor para Azure blob storage es usar una herramienta gratuita de administración de almacenamiento de Azure llamada Azure Explorer de Cerebrata.

Le permite crear un contenedor creando una nueva carpeta.

Azure Explorer