如何列出虚拟目录中没有前缀的blob?

时间:2014-12-12 06:30:22

标签: azure azure-storage azure-storage-blobs

我有以下blob列表:

  • VirtualDirectroy1 / VirtualSubDirectory1 / Blob1
  • VirtualDirectroy2 / VirtualSubDirectory2 / Blob2
  • VirtualDirectroy3 / VirtualSubDirectory3 / Blob3

我需要列出Blob1,Blob2和Blob3,这样当访问CloudBlockBlob.Name属性时,它只返回Blob1,Blob2或Blob 3 WITHOUT前缀的虚拟目录。

我如何存档?

祝福,Oleg

3 个答案:

答案 0 :(得分:3)

如果您使用的是Azure存储.Net客户端库(我使用的是版本3.0.3,其中有这些方法/重载可用),您可以执行以下操作:

var container = GetBlobContainer();
foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true))
{
    Console.WriteLine(blob.Parent.Uri.MakeRelativeUri(blob.Uri));
}

答案 1 :(得分:2)

我发现你可以这样做:

var storageAccountConnectionString = "...";
var storageAccount = CloudStorageAccount.Parse(storageAccountConnectionString);

var cloudBlobClient = storageAccount.CreateCloudBlobClient();
var cloudBlobContainer = cloudBlobClient.GetContainerReference("containerName");
foreach (var blob in cloudBlobContainer.ListBlobs())
{
    Console.WriteLine(blob.Uri.Segments.Last());
}

答案 2 :(得分:0)

class Program
{
    const string _conStr = "storage connection string";
    const string _container =  "container name";
    static void Main(string[] args)
    {
        var names = new Program().GetBlobNames();
        Console.ReadKey();
    }

    private List<string> GetBlobNames()
    {
        CloudStorageAccount acc = CloudStorageAccount.Parse(_conStr);
        CloudBlobClient blobClient = acc.CreateCloudBlobClient();
        CloudBlobContainer cntnr = blobClient.GetContainerReference(_container);
        List<IListBlobItem> blobList = cntnr.ListBlobs("").ToList();
        List<string> flatList = new List<string>();
        List<IListBlobItem> blobItems = new List<IListBlobItem>();
        foreach (IListBlobItem blobItem in blobList)
        {
            //If it is cloudblob directory
            if (blobItem.GetType() == typeof(CloudBlobDirectory))
            {
                CloudBlobDirectory dir = blobItem as CloudBlobDirectory;
                GetFilesInDirectory(dir, blobItems);
            }
        }
        return blobItems.Select(b => b.Parent.Uri.MakeRelativeUri(b.Uri).ToString()).ToList();            
    }


    private void GetFilesInDirectory(CloudBlobDirectory directory, List<IListBlobItem> fileList)
    {
        foreach (var blobItem in directory.ListBlobs())
        {
            if (blobItem.GetType() == typeof(CloudBlockBlob))
            {
                CloudBlockBlob blob = (CloudBlockBlob)blobItem;                    
                fileList.Add(blob);
            }
            else if (blobItem.GetType() == typeof(CloudPageBlob))
            {
                CloudPageBlob blob = (CloudPageBlob)blobItem;
                fileList.Add(blob);
            }
            else if (blobItem.GetType() == typeof(CloudBlobDirectory))
            {
                //Fetch recursively all the blobs
                CloudBlobDirectory blob = (CloudBlobDirectory)blobItem;
                GetFilesInDirectory(blob, fileList);
            }
        }
    }
}