当前位置: 首页 > 知识库问答 >
问题:

如何使用c#获取Azure Blob存储容器中现有目录的列表?

白博赡
2023-03-14

我有一个在Core .NET 2.2框架顶部使用C#编写的控制台应用。

我正在尝试C#库来获取我的容器中所有目录的列表。我的理解是Azure Blob存储并没有真正的目录。相反,它创建虚拟名称,Blob看起来像Azure Blob Explorer等浏览器中容器内的文件夹

我使用以下代码存储文件:

CloudBlockBlob blockBlob = container.GetBlockBlobReference("foldername/filename.jpg");

await blockBlob.UploadFromStreamAsync(stream);

所以我想在我的容器内选择前缀aka文件夹名称的不同列表。

所以如果我有以下blob“foldername 1/file 1 . jpg”、“foldername1/file2.jpg”、“foldername1/file3.jpg”、“foldername2/file1.jpg”。我想返回“文件夹名1”,“文件夹名2”

如何从Azure Blob存储中获取不同前缀的列表?

更新

我试图从下面的评论中获得反馈,所以我想出了以下代码

public async Task<string[]> Directories(string path = null)
{
    int index = path == null ? 0 : path.Split('/', StringSplitOptions.RemoveEmptyEntries).Length;

    BlobContinuationToken token = null;
    List<string> directories = new List<string>();
    do
    {
        BlobResultSegment blobsListingResult = await ContainerFactory.Get().ListBlobsSegmentedAsync(path ?? string.Empty, true, BlobListingDetails.None, 5000, token, null, null);
        token = blobsListingResult.ContinuationToken;
        IEnumerable<IListBlobItem> blobsList = blobsListingResult.Results;
        foreach (var item in blobsList)
        {
            var blobName = (item as CloudBlob).Name;
            var blobParts = blobName.Split('/', StringSplitOptions.RemoveEmptyEntries);

            if (blobParts.Length <= index)
            {
                // At this point, we know that this not a directory inside the provided path directory
                continue;
            }

            directories.Add(blobParts[index]);
        }
    }
    while (token != null);

    return directories.Distinct().ToArray();
}

由于我在容器中有很多 blob,因此这需要很长时间,因为它必须几乎获取每个块才能获取目录列表。此外,这可能非常昂贵,因为我每次调用此方法时都必须读取每个 blob。

我基本上需要与运行Director.GetDirectories(path)相同的结果,如果一切都在本地运行!有没有办法改进这个功能?

共有2个答案

慕河
2023-03-14

也许您可以通过检查blob项的类型来改进解决方案?

        var result = new List<string>();
        var directory = _blobContainer.GetDirectoryReference(relativeFilePath);

        if (directory.Equals(null))
            return result;

        var blobs = directory.ListBlobsSegmentedAsync(null).Result;

        foreach (var item in blobs.Results)
        {
            if (item.GetType() == typeof(CloudBlobDirectory)) 
            {
                result.Add(item.Uri.Segments.Last().Trim('/'));
            }
        }

        return result;

我没有太多的文件夹,所以最好仔细检查一下性能是否满足您的要求。

东方俊材
2023-03-14

我发现最好的方法是不要像对待文件夹/文件存储那样对待Blob存储。保持文件(blobs)在那里,但是使用一些其他的方法来跟踪你的文件夹结构。我选择的方法是包含我的文件夹结构的SQL数据库,然后是对Azure中blob文件的引用。在Azure中直接调用所有这些代码的问题是:

从长远来看,这会给你带来不必要的成本

您最好按照我的建议进行,将元数据保存在其他地方,并将Blob存储用于其预期的用途-存储blob

 类似资料:
  • 问题内容: 我有许多使用CTE,临时表,表变量和子查询的存储过程,我需要获取该存储过程中使用的所有列(包括数据库,架构和表/视图)的列表。我不需要获取临时表,表变量或CTE中的列。我只需要在服务器上的数据库的表或视图中定义的引用列。 我试过了,但是在第一个选择查询后或在CTE中选择后,它们不返回列。 问题答案: 当执行存储过程时,它将被解析并编译成查询计划,将对其进行缓存,您可以通过sys.dm_

  • 问题内容: 假设我有一个URL:我想获得目录下所有文件/目录的列表。 我正在使用Java 5。 我可以使用此程序http://www.httrack.com/获得dir的列表,但是使用Java我不知道是否可行。 有谁知道如何用Java获得它?或者,如果Java无法执行,该程序将如何完成工作? 问题答案: 有一些条件: 服务器必须已启用目录列表,以便您查看其内容。 我没有办法(没有API或HTTP动

  • 问题内容: 只是一个简单的问题,如何获得指定目录内的目录列表。 例如, 现在,我需要获取“路径”目录中的目录列表。 谢谢! 问题答案: 诸如此类(添加null检查,异常等。)

  • 问题内容: 我正在尝试使用Node.js获取目录中存在的所有文件的名称的列表。我想要的输出是一个文件名数组。我怎样才能做到这一点? 问题答案: 您可以使用或方法。 fs.readdir fs.readdirSync 两种方法的区别在于,第一种是异步的,因此您必须提供一个回调函数,该函数将在读取过程结束时执行。 第二个是同步的,它将返回文件名数组,但是它将停止代码的任何进一步执行,直到读取过程结束。

  • 问题内容: 因此,我试图使用文件handle.list()方法获取目录中的文件列表,但是即使目录中有文件,它也会返回一个空列表。在我看来,奇怪的是它可以在设备上运行,但不能在桌面上运行。我想我知道问题出在哪里,但是我却不知道如何解决。在方法描述中,它说“在桌面上,类路径上目录的FileType.Internal句柄将返回长度为零的数组。”,但是除此之外没有其他方法,所以你们认为我能做什么? 问题答

  • 问题内容: 有没有办法在Python中返回当前目录中所有子目录的列表? 我知道您可以使用文件来执行此操作,但是我需要获取目录列表。 问题答案: 你是指直接子目录,还是树下的每个目录? 无论哪种方式,你都可以使用以下方法: 将为每个子目录生成一个元组。该三元组中的第一个条目是目录名称,因此 应该递归地给你所有的子目录。 请注意,元组中的第二个条目是该条目在第一个位置的子目录的列表,因此你可以改用它,