【问题标题】:Azure Datalake Storage list first level of directories in containerAzure Data Lake Storage 列出容器中的第一级目录
【发布时间】:2021-07-26 18:50:25
【问题描述】:

我有一个名为 foo 的容器和其中的几个目录,其层次结构如下:

foo\dir1
foo\dir2
...

我怎样才能只检索dir1 & dir2 目录?目前我正在使用Azure.Storage.Blobs (12.9.1) 库。

我尝试过的:

      var blobContainerClient = blobServiceClient.GetBlobContainerClient("foo");

      var resultSegment = blobContainerClient.GetBlobs().AsPages();
      IList<string> blobs = new List<string>();
      foreach(Azure.Page<BlobItem> blobPage in resultSegment)
      {
        foreach(BlobItem blobItem in blobPage.Values)
        {
          blobs.Add(blobItem.Name);
        } 
      }

      return blobs;
    }

这会递归地返回我在foo 容器中拥有的所有文件。我需要提一下,这是一个分层命名空间存储,我已经尝试过this 解决方案,但它不起作用,因为我认为每个目录都被认为是一个 blob

【问题讨论】:

  • 您应该可以使用前缀。类似的东西应该可以工作blobContainerClient.GetBlobs(prefix: "dir1")
  • 是的,但我最初不知道dir1。我只知道容器的名字。

标签: azure azure-blob-storage


【解决方案1】:

我找到了一个解决方案,但我不知道这是否是最好的。当出现另一个解决方案时,我将删除它。

因此,在分层存储帐户(数据湖)中,如果我正确理解,即使是目录也被视为 blob。在这种情况下,我观​​察到目录有contentLength = 0contentHashbyte[0]。考虑到这些假设,我设法做到了以下几点:

      var blobContainerClient = blobServiceClient.GetBlobContainerClient("foo");

      return blobContainerClient.GetBlobs()
        .Where(b => b.Properties.ContentLength == 0 && b.Properties.ContentHash.Length == 0)
        .Select(b => b.Name)
        .ToList();

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多