我怎样才能从CloudBlobDirectory.ListBlobs到BlockBlob对象的引用?

2019-08-06 09:27发布

我现在用的是微软的Azure .NET客户端库与Azure云存储交互。 我需要能够访问有关的元数据集合中的每个斑点的附加信息。 我目前使用CloudBlobDirectory.ListBlobs()方法得到的目录结构,我在团块名设计的特定目录的斑点的列表。 所述ListBlobs()方法返回IListBlobItem对象的列表。 他们只有几个属性:URL和引用父目录的父容器。 我需要得到实际的BLOB对象的元数据。

我设想会有办法要么投的IListBlobItem到BlockBlob对象或使用IListBlockItem去的BlockBlob的引用,但似乎无法找到一个方法来做到这一点。

我的问题是:有没有办法摆脱这种方法BlockBlob对象呢,还是必须使用得到实际的BlockBlob对象以不同的方式? 如果不同,那么你能提出一个方法来实现这一目标,同时还能够通过“目录”方案来过滤?

Answer 1:

OK ......我发现了一个办法做到这一点,而它似乎有点笨重,间接的,它实现我想应该是可行的主要的事情,这是直接投了IListBlobItem到CloudBlockBlob对象。

我做的是充分利用Directory对象的ListBlobs名单()方法,然后遍历列表中的每个项目和铸造项目一CloudBlockBlob对象,然后调用FetchAttributes()方法来检索属性(包括元数据) 。 然后添加一个新的“信息”对象信息对象的新名单。 下面是我使用的代码:

CloudBlobDirectory dir = container.GetDirectoryReference(dirPath);

var blobs = dir.ListBlobs(true);

foreach (IListBlobItem item in blobs)
{
    CloudBlockBlob blob = (CloudBlockBlob)item;
    blob.FetchAttributes();
    files.Add(new ImageInfo
    {
        FileUrl = item.Uri.ToString(),
        FileName = item.Uri.PathAndQuery.Replace(restaurantId.ToString().PadLeft(3, '0') + "/", ""),
        ImageName = blob.Metadata["Name"]
    });
}

整个“斑点”的概念似乎是不必要的复杂性似乎并没有达到我有什么想法本来的斑点包装的主要特征之一。 也就是说,通过允许在名称,目录,容器和元数据的查询扩展搜索功能的一种方式。 我还以为你可以构建LINQ查询会读有点像:“在‘图像’集装箱返回所有斑点的列表,这是在‘自然/风景/’目录中有“元数据的关键路径”与价值‘夕阳’”的范畴。 似乎没有成为一个办法做到这一点,这似乎是一个错失的机会给我。 那好吧。

如果我错了,大错特错在这里,请让我知道。



Answer 2:

这种方法已经被开发用于Java的 ,但我希望能以某种方式被修改,以适应任何其他支持的编程语言。 尽管你问的功能还没有被明确地开发出来,我想我发现了一个不同的(希望少cluncky)的方式来访问CloudBlockBlob从数据ListBlobItem元素。

下面的代码可以用来删除,例如,每隔一个斑点混凝土目录内部。

String blobUri;
CloudBlobClient blobClient = /* Obtain your blob client */

try{
     CloudBlobContainer container = /* Obtain your blob container */

     for (ListBlobItem blobItem : container.listBlobs(blobPrefix)) {

          if (blobItem instanceof CloudBlob) {
                blob = (CloudBlob) blobItem;
                if (blob.exists()){
                    System.out.println("Deleting blob " + blob.getName());
                    blob.delete();
                }
          }
     }
}catch (URISyntaxException | StorageException ex){
        Logger.getLogger(BlobOperations.class.getName()).log(Level.SEVERE, null, ex);
}


文章来源: How can I get references to BlockBlob objects from CloudBlobDirectory.ListBlobs?