この記事では、Azure Storageクライアントライブラリ(.NET)を使ってブロブをリストアップする方法を紹介しています。
前提条件
- Azure サブスクリプション - 無料アカウントを作成する
- Azure Storage アカウント - ストレージ アカウントの作成
- 使用するオペレーティング システム用の最新の .NET SDK。 ランタイムではなく、必ず SDK を入手してください。
環境を設定する
既存のプロジェクトがない場合、このセクションでは、.NET 用 Azure Blob Storage クライアント ライブラリを使用するようにプロジェクトを設定する方法について説明します。 このステップには、パッケージのインストール、usingディレクティブの追加、承認されたクライアント オブジェクトの作成が含まれます。 詳細については、「Azure Blob Storage と .NET の概要」に関するページを参照してください。
パッケージをインストールする
プロジェクト ディレクトリから、dotnet add package コマンドを使用して、Azure Blob Storage と Azure ID のクライアント ライブラリのパッケージをインストールします。 Azure サービスへのパスワードレス接続には、Azure.Identity パッケージが必要です。
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
using ディレクティブを追加します
次の using ディレクティブをコード ファイルの先頭に追加します。
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
この記事の一部のコード例では、追加のusing ディレクティブが必要な場合があります。
クライアント オブジェクトの作成
アプリを Blob Storage に接続するには、 BlobServiceClientのインスタンスを作成します。 次の例では、認可のために DefaultAzureCredential を使用してクライアント オブジェクトを作成する方法を示します。
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.windows.net"),
new DefaultAzureCredential());
return client;
}
.NET アプリに依存関係の挿入用のサービス クライアントを登録できます。
また、特定のコンテナーまたは BLOB 用のクライアント オブジェクトを作成することもできます。 クライアント オブジェクトの作成と管理の詳細については、「データ リソースを操作するクライアント オブジェクトを作成および管理する」を参照してください。
認可
認可メカニズムには、BLOB を一覧表示するために必要なアクセス許可が必要です。 Microsoft Entra IDでの認証(推奨)には、Azure RBACの組み込みロールであるStorage Blob Data Reader以上のものが必要です。 詳細については、List Blobs (REST API) の「認可」のガイダンスを参照してください。
Blob の一覧表示オプションについて
BLOB をコードから一覧表示する際には、Azure Storage からの結果の取得方法を管理するためのオプションをいくつか指定できます。 各結果セットで返す結果の数を指定し、後続のセットを取得できます。 名前がその文字または文字列から始まる BLOB を返すようにプレフィックスを指定できます。 ブロブはフラットなリスト構造でも階層的にリストアップすることもできます。 階層リストでは、フォルダーに整理されたかのように BLOB が返されます。
ストレージ アカウント内の BLOB を一覧表示するには、次のいずれかのメソッドを呼び出します。
- BlobContainerClient.GetBlobs
- BlobContainerClient.GetBlobsAsync
- BlobContainerClient.GetBlobsByHierarchy
- BlobContainerClient.GetBlobsByHierarchyAsync
返される結果の数を管理する
既定では、一覧表示操作から一度に最大 5,000 件の結果が返されますが、各一覧表示操作で返される結果の数は指定できます。 この記事の例は、結果をページに返す方法を示しています。 改ページの概念の詳細については、「Azure SDK for .NET を使用した改ページ」を参照してください。
プレフィックスを使用して結果をフィルター処理する
BLOB の一覧をフィルター処理するには、prefix パラメーターの文字列を指定します。 プレフィックス文字列には、1 つ以上の文字を含めることができます。 Azure Storage は、名前がそのプレフィックスで始まる BLOB だけを返します。
メタデータを返す
結果を含む BLOB メタデータを返すには、BlobTraits 列挙型のメタデータ値を指定します。
フラットな一覧表示と階層的な一覧表示
Azure Storage の BLOB は、(従来のファイル システムのような) 階層的なパラダイムではなく、フラットなパラダイムで組織化されます。 ただし、フォルダー構造を模倣するために、BLOB を仮想ディレクトリに組織化することができます。 仮想ディレクトリは BLOB 名の一部を形成し、区切り文字によって示されます。
BLOB を仮想ディレクトリに組織化するには、BLOB 名に区切り文字を使用します。 既定の区切り文字はスラッシュ (/) ですが、区切り文字として任意の文字を指定できます。
区切り記号を使用して BLOB に名前を付ける場合、BLOB を階層的に一覧表示することを選択できます。 階層的な一覧表示操作の場合、Azure Storage は、親オブジェクトの下にあるすべての仮想ディレクトリと 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
注
次に示すサンプル出力では、フラット型名前空間を持つストレージ アカウントがあることを前提としています。 ストレージアカウントで階層的な名前空間機能を有効にすると、ディレクトリは仮想ではありません。 むしろ、それらは具体的で独立したオブジェクトです。 その結果、ディレクトリは長さ 0 の BLOB として一覧に表示されます。
階層型名前空間を使って作業する場合の別のリスト オプションについては、「ディレクトリの内容を一覧表示する (Azure Data Lake Storage)」を参照してください。
階層的な一覧表示を使用する
一覧表示操作を階層的に呼び出すと、Azure Storage は、階層の最初のレベルに仮想ディレクトリと BLOB を返します。
ブロブを階層的にリストアップするには、 BlobContainerClient.GetBlobsByHierarchy または BlobContainerClient.GetBlobsByHierarchyAsync メソッドを呼び出します。
以下の例では、指定されたコンテナ内のブロブを階層的なリスト付けでリストし、オプションのセグメントサイズを指定し、コンソールウィンドウにブロブ名を書き込みます。
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 のバージョンまたはスナップショットを一覧表示するには、[バージョン] または [スナップショット] フィールドで 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;
}
}
Apache Arrow形式のリストブロブ(プレビュー)
Important
Apache Arrow形式でのブロブ表示は現在 プレビュー中です。 このシナリオでは、.NET用にAzure Blob Storageクライアントライブラリのベータ(プレビュー)バージョン(例:Azure.Storage.Blobs12.30.0-beta.1以降のプレビューリリース)が必要です。 プレビュー機能は、サービス レベル アグリーメントなしで提供され、運用環境のワークロードには推奨されません。 一部の機能はサポートされていないか、機能が制限されている場合があります。 詳細については、「 Microsoft Azure プレビューの追加使用条件」を参照してください。
この機能は既存の List Blobs APIを基盤としています。 デフォルトのXMLを使う代わりに、ワイヤー上のレスポンス形式としてコンパクトで列状の Apache Arrow 形式を使用しています。 コンテナリスティングコールで単一のオプションを設定することで有効化できます。 .NET SDKは舞台裏でApache Arrowを解読し、同じオブジェクトBlobItem返します。 この方法は、大規模なコンテナを列挙する際にリストスループットを向上させ、クライアント側のCPUを削減します。 これは、アプリケーションが依存する応答契約を保持します。
Warning
階層的な名前空間(Azure Data Lake Storage)が有効になっているストレージアカウントでは、Apache Arrow形式でのブロブ表示はサポートされていません。
Apache Arrow形式の結果を要求するには、GetBlobsOptionsのResponseFormatプロパティをStorageResponseFormat.Arrowに設定し、そのオプションをGetBlobsOptionsを受け入れるBlobContainerClient.GetBlobsオーバーロードに渡します。 Apache Arrowの出力を使う場合、 StartFrom や EndBefore プロパティを設定して、返されるパスの範囲を制御することもできます。
以下の例はコンテナ内のブロブを一覧にし、Apache Arrow形式で結果をリクエストします:
using Azure.Storage;
using Azure.Storage.Blobs.Models;
GetBlobsOptions options = new GetBlobsOptions
{
Prefix = "FolderA/",
ResponseFormat = StorageResponseFormat.Arrow
};
foreach (BlobItem blobItem in containerClient.GetBlobs(options))
{
Console.WriteLine("Blob name: " + blobItem.Name);
}
リソース
.NET用のAzure Blob Storageクライアントライブラリを使ってブロブをリストアップする方法については、以下のリソースをご覧ください。
REST API の操作
Azure SDK for .NETには、Azure REST APIの上に構築されたライブラリが含まれています。 これらのライブラリを使うことで、馴染みのある.NETパラダイムを通じてREST API操作とやり取りできます。 BLOB を一覧表示するためのクライアント ライブラリ メソッドは、次の REST API 操作を使用します。
- BLOB の一覧表示 (REST API)
クライアント ライブラリのリソース
関連項目
関連するコンテンツ
- この記事は、.NET の Blob Storage 開発者ガイドの一部です。 詳細については、「.NET アプリのビルド」にある開発者ガイドの記事の完全な一覧を参照してください。