12

MS已经宣布了像blob存储这样的目录,我正在尝试像目录一样使用它。按名称保存了一些 blob:

Common\Service1\Type1\Object1
Common\Service1\Type1\Object2
Common\Service1\Type2\Object1
Common\Service1\Type2\Object2
Common\Service1\Type3\Object1
Common\Service1\Type3\Object2
Common\Service1\Type3\Object3

我希望有可能枚举子目录,例如我有 blobclient 引用了Common容器名称,并且我想获取 subcontainers list Type1, Type2, Type3。是否可以获取某个目录中的子目录列表。使用 ListBlobs 返回当前容器中的完整 Blob 列表。

4

3 回答 3

19

如果您想列出“Common\Service1”目录中的所有“子目录”,可以使用如下内容:

    var directory = blobContainer.GetDirectoryReference(@"Common/Service1");
    var folders = directory.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList();
    foreach (var folder in folders)
    {
        Console.WriteLine(folder.Uri);
    }

完整代码示例:

    var random = new Random();
    CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
    var cloudBlobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer blobContainer = cloudBlobClient.GetContainerReference("test-container");
    blobContainer.CreateIfNotExists();
    string[] objects = new[]
                           {
                               @"Common\Service1\Type1\Object1", @"Common\Service1\Type1\Object2", @"Common\Service1\Type2\Object1",
                               @"Common\Service1\Type2\Object2", @"Common\Service1\Type3\Object1", @"Common\Service1\Type3\Object2",
                               @"Common\Service1\Type3\Object3"
                           };
    foreach (var newObject in objects)
    {
        var newBlob = blobContainer.GetBlockBlobReference(newObject);
        var buffer = new byte[1024];
        random.NextBytes(buffer);
        newBlob.UploadFromByteArray(buffer,0,buffer.Length);
    }

    var directory = blobContainer.GetDirectoryReference(@"Common/Service1");
    var folders = directory.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList();
    foreach (var folder in folders)
    {
        Console.WriteLine(folder.Uri);
    }

这将为 Type1、Type2 和 Type3 目录输出 Uri。

于 2014-11-11T15:37:58.713 回答
10

基于b2zw2a 的回答

  • @仅在使用时需要,\不需要/
  • 不要ToList()ListBlobs(). ListBlobs()提供延迟加载,并为您提供更好的性能。
  • 用于OfType<CloudBlobDirectory>()仅过滤掉您想要的类型

给你:

var directory = blobContainer.GetDirectoryReference("Common/Service1");
var folders = directory.ListBlobs().OfType<CloudBlobDirectory>();
foreach (var folder in folders)
{
    Console.WriteLine(folder.Uri);
}
于 2016-12-07T16:07:09.530 回答
-1
var nameList=logoContainer.ListBlobs().Where(b => b as CloudBlobDirectory != null).Select(x => x.Uri + "").ToList();

通过使用它,您可以在单个查询中获取所有文件名。

于 2017-05-04T13:42:29.090 回答