使用 .NET 列出 blob

本文介绍如何使用适用于 .NET 的 Azure 存储客户端库列出 blob。

先决条件

  • 本文假设已经设置了项目来使用适用于 .NET 的 Azure Blob 存储客户端库。 要了解有关设置项目的信息,包括包安装、添加 using 指令和创建授权客户端对象,请参阅开始使用 Azure Blob 存储和 .NET
  • 授权机制必须具有列出 blob 的权限。 若要了解详细信息,请参阅以下 REST API 操作的授权指南:

了解 blob 列出选项

通过代码列出 Blob 时,可以指定多个选项来管理如何从 Azure 存储返回结果。 可以指定要在每个结果集中返回的结果数,然后检索后续结果集。 可以指定前缀以返回名称以该字符或字符串开头的 blob。 而且,可以在平面列表结构中列出 blob,也可以分层列出 blob。 分层列表返回 blob,就像它们被组织到文件夹中一样。

若要列出存储帐户中的 Blob,请调用以下方法之一:

管理要返回的结果数

默认情况下,列表操作一次最多返回 5000 个结果,但你可以指定你所希望的每个列表操作返回的结果数。 本文演示的示例说明了如何在页面中返回结果。 要详细了解分页概念,请参阅使用适用于 .NET 的 Azure SDK 进行分页

使用前缀筛选结果

若要筛选 blob 列表,请为 prefix 参数指定一个字符串。 前缀字符串可以包含一个或多个字符。 然后,Azure 存储只返回其名称以该前缀开头的 Blob。

返回元数据

可以通过为 BlobTraits 枚举指定 Metadata 值来返回包含结果的 blob 元数据。

平面列表与分层列表

Azure 存储中的 Blob 以平面范式进行组织,而不是以分层范式(类似于经典文件系统)进行组织。 但是,可以将 Blob 组织到虚拟目录中,以便模拟文件夹结构。 虚拟目录构成 blob 名称的一部分,并由分隔符表示。

若要将 blob 组织为虚拟目录,请在 blob 名称中使用分隔符。 默认分隔符是正斜杠 (/),但你可以指定任何字符作为分隔符。

如果使用分隔符来命名 Blob,可以选择以分层方式列出 Blob。 对于分层列出操作,Azure 存储将返回父对象下的所有虚拟目录和 Blob。 可以递归方式调用列出操作来遍历层次结构,类似于以编程方式遍历经典文件系统。

使用平面列出

默认情况下,列出操作在平面列表中返回 Blob。 在平面列表中,Blob 不会按虚拟目录进行组织。

以下示例使用平面列表列出指定容器中的 Blob(其中指定了可选的段大小),并将 Blob 名称写入控制台窗口。

private static async Task ListBlobsFlatListing(BlobContainerClient blobContainerClient, 
                                               int? segmentSize)
{
    try
    {
        // Call the listing operation and return pages of the specified size.
        var resultSegment = blobContainerClient.GetBlobsAsync()
            .AsPages(default, segmentSize);

        // Enumerate the blobs returned for each page.
        await foreach (Page<BlobItem> blobPage in resultSegment)
        {
            foreach (BlobItem blobItem in blobPage.Values)
            {
                Console.WriteLine("Blob name: {0}", blobItem.Name);
            }

            Console.WriteLine();
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

示例输出类似于:

Blob name: FolderA/blob1.txt
Blob name: FolderA/blob2.txt
Blob name: FolderA/blob3.txt
Blob name: FolderA/FolderB/blob1.txt
Blob name: FolderA/FolderB/blob2.txt
Blob name: FolderA/FolderB/blob3.txt
Blob name: FolderA/FolderB/FolderC/blob1.txt
Blob name: FolderA/FolderB/FolderC/blob2.txt
Blob name: FolderA/FolderB/FolderC/blob3.txt

注意

所显示的示例输出假定你有一个带平面命名空间的存储帐户。 如果为存储帐户启用了分层命名空间功能,则目录不是虚拟目录。 而是具体的独立对象。 因此,目录会在列表中显示为零长度 blob。
有关使用分层命名空间时的备用列表选项
,请参阅列出目录内容 (Azure Data Lake Storage Gen2)

使用分层列表

以分层方式调用列出操作时,Azure 存储将返回位于层次结构第一级别的虚拟目录和 Blob。

若要以分层方式列出 blob,请调用 BlobContainerClient.GetBlobsByHierarchyBlobContainerClient.GetBlobsByHierarchyAsync 方法。

以下示例使用分层列表列出指定容器中的 Blob(其中指定了可选的段大小),并将 Blob 名称写入控制台窗口。

private static async Task ListBlobsHierarchicalListing(BlobContainerClient container, 
                                                       string prefix, 
                                                       int? segmentSize)
{
    try
    {
        // Call the listing operation and return pages of the specified size.
        var resultSegment = container.GetBlobsByHierarchyAsync(prefix:prefix, delimiter:"/")
            .AsPages(default, segmentSize);

        // Enumerate the blobs returned for each page.
        await foreach (Page<BlobHierarchyItem> blobPage in resultSegment)
        {
            // A hierarchical listing may return both virtual directories and blobs.
            foreach (BlobHierarchyItem blobhierarchyItem in blobPage.Values)
            {
                if (blobhierarchyItem.IsPrefix)
                {
                    // Write out the prefix of the virtual directory.
                    Console.WriteLine("Virtual directory prefix: {0}", blobhierarchyItem.Prefix);

                    // Call recursively with the prefix to traverse the virtual directory.
                    await ListBlobsHierarchicalListing(container, blobhierarchyItem.Prefix, null);
                }
                else
                {
                    // Write out the name of the blob.
                    Console.WriteLine("Blob name: {0}", blobhierarchyItem.Blob.Name);
                }
            }

            Console.WriteLine();
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

示例输出类似于:

Virtual directory prefix: FolderA/
Blob name: FolderA/blob1.txt
Blob name: FolderA/blob2.txt
Blob name: FolderA/blob3.txt

Virtual directory prefix: FolderA/FolderB/
Blob name: FolderA/FolderB/blob1.txt
Blob name: FolderA/FolderB/blob2.txt
Blob name: FolderA/FolderB/blob3.txt

Virtual directory prefix: FolderA/FolderB/FolderC/
Blob name: FolderA/FolderB/FolderC/blob1.txt
Blob name: FolderA/FolderB/FolderC/blob2.txt
Blob name: FolderA/FolderB/FolderC/blob3.txt

注意

在分层列出操作中无法列出 Blob 快照。

列出 Blob 版本或快照

若要列出 blob 版本或快照,请在“版本”或“快照”字段中指定 BlobStates 参数。 版本和快照将按最旧到最新的顺序列出。

下面的代码示例演示如何列出 blob 版本。

private static void ListBlobVersions(BlobContainerClient blobContainerClient, 
                                           string blobName)
{
    try
    {
        // Call the listing operation, specifying that blob versions are returned.
        // Use the blob name as the prefix. 
        var blobVersions = blobContainerClient.GetBlobs
            (BlobTraits.None, BlobStates.Version, prefix: blobName)
            .OrderByDescending(version => version.VersionId).Where(blob => blob.Name == blobName);

        // Construct the URI for each blob version.
        foreach (var version in blobVersions)
        {
            BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobContainerClient.Uri)
            {
                BlobName = version.Name,
                VersionId = version.VersionId
            };

            if ((bool)version.IsLatestVersion.GetValueOrDefault())
            {
                Console.WriteLine("Current version: {0}", blobUriBuilder);
            }
            else
            {
                Console.WriteLine("Previous version: {0}", blobUriBuilder);
            }
        }
    }
    catch (RequestFailedException e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
        throw;
    }
}

资源

若要详细了解如何使用适用于 .NET 的 Azure Blob 存储客户端库来列出 Blob,请参阅以下资源。

REST API 操作

Azure SDK for .NET 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 .NET 范例与 REST API 操作进行交互。 用于列出 blob 的客户端库方法使用以下 REST API 操作:

客户端库资源

另请参阅