如何从CloudBlobDirectory.ListBlobs获取对BlockBlob对象的引用?

Ric*_*d B 17 azure-storage

我使用Microsoft Azure .NET客户端库与Azure云存储进行交互.我需要能够访问其元数据集合中每个blob的其他信息.我目前正在使用CloudBlobDirectory.ListBlobs()方法获取我在blob名称中设计的目录结构的特定目录中的blob列表.ListBlobs()方法返回IListBlobItem对象的列表.它们只有几个属性:Url以及对父目录和父容器的引用.我需要获取实际blob对象的元数据.

我设想有一种方法可以将IListBlobItem强制转换为BlockBlob对象,或者使用IListBlockItem来获取对BlockBlob的引用,但似乎无法找到一种方法.

我的问题是:有没有办法从这个方法获取BlockBlob对象,还是我必须使用不同的方式获取实际的BlockBlob对象?如果不同,那么你可以建议一种方法来实现这一点,同时还能够通过"目录"方案进行过滤吗?

Ric*_*d B 22

好的......我找到了一种方法来做到这一点,虽然看起来有点笨重和间接,但它确实实现了我认为应该可行的主要内容,即将IListBlobItem直接转换为CloudBlockBlob对象.

我正在做的是从Directory对象的ListBlobs()方法获取列表,然后循环遍历列表中的每个项目并将项目转换为CloudBlockBlob对象,然后调用FetchAttributes()方法来检索属性(包括元数据) .然后将新的"info"对象添加到新的info对象列表中.这是我正在使用的代码:

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"]
    });
}
Run Code Online (Sandbox Code Playgroud)

整个"Blob"概念似乎不必要地复杂,并且似乎没有达到我认为可能是Blob包装器的主要特征之一.也就是说,通过允许对名称,目录,容器和元数据进行查询来扩展搜索功能的方法.我原本以为你可以构建一个linq查询,其读取方式有点像:"返回'images'容器中所有blob的列表,这些blob位于'natural/landscapes /'目录路径中,其元数据键为'类别'具有'日落'的价值".似乎没有办法做到这一点,这似乎是错过了我的机会.那好吧.

如果我错了,请离开这里,请告诉我.


Mik*_*kia 6

这种方法是为Java开发的,但我希望它可以以某种方式进行修改以适应任何其他受支持的语言。尽管您要求的功能尚未明确开发,但我想我找到了一种不同的(希望不那么笨拙)的方式来访问元素中的CloudBlockBlob数据ListBlobItem

例如,以下代码可用于删除特定目录中的每个 blob。

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);
}
Run Code Online (Sandbox Code Playgroud)