web-dev-qa-db-ja.com

Azureのコンテナー内のすべてのblobのリストを取得するにはどうすればよいですか?

Azureのストレージアカウントのアカウント名とアカウントキーを持っています。そのアカウントのコンテナー内のすべてのblobのリストを取得する必要があります。 (「$ logs」コンテナ)。

CloudBlobClientクラスを使用して特定のblobの情報を取得できますが、$ logsコンテナー内のすべてのblobのリストを取得する方法がわかりません。

13
SKLAK

https://Azure.Microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/にあるコンテナー内のすべてのblobをリストする方法のサンプルがあります。 #list-the-blobs-in-a-container

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("photos");

// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
    if (item.GetType() == typeof(CloudBlockBlob))
    {
        CloudBlockBlob blob = (CloudBlockBlob)item;
        Console.WriteLine("Block blob of length {0}: {1}", blob.Properties.Length, blob.Uri);
    }
    else if (item.GetType() == typeof(CloudPageBlob))
    {
        CloudPageBlob pageBlob = (CloudPageBlob)item;
        Console.WriteLine("Page blob of length {0}: {1}", pageBlob.Properties.Length, pageBlob.Uri);
    }
    else if (item.GetType() == typeof(CloudBlobDirectory))
    {
        CloudBlobDirectory directory = (CloudBlobDirectory)item;
        Console.WriteLine("Directory: {0}", directory.Uri);
    }
}

あなたのコンテナ名は$ logsなので、あなたのblobタイプはappend blobだと思います。すべてのblobを取得してIEnumerableを返すメソッドは次のとおりです。

    private static CloudBlobClient _blobClient = CloudStorageAccount.Parse("connectionstring").CreateCloudBlobClient();
    public IEnumerable<CloudAppendBlob> GetBlobs()
    {
        var container = _blobClient.GetContainerReference("$logs");
        BlobContinuationToken continuationToken = null;

        do
        {
            var response = container.ListBlobsSegmented(string.Empty, true, BlobListingDetails.None, new int?(), continuationToken, null, null);
            continuationToken = response.ContinuationToken;
            foreach (var blob in response.Results.OfType<CloudAppendBlob>())
            {
                yield return blob;
            }
        } while (continuationToken != null);
    }

メソッドは非同期にすることができます。ListBlobsSegmentedAsyncを使用するだけです。注意する必要があることの1つは、引数useFlatBlobListingをtrueにする必要があることです。これは、ListBlobsが階層リストではなく、ファイルのフラットリストを返すことを意味します。

6
Feiyu Zhou

WindowsAzure.Storage v9.0の更新されたAPI呼び出しは次のとおりです。

private static CloudBlobClient _blobClient = CloudStorageAccount.Parse("connectionstring").CreateCloudBlobClient();

public async Task<IEnumerable<CloudAppendBlob>> GetBlobs()
{
    var container = _blobClient.GetContainerReference("$logs");
    BlobContinuationToken continuationToken = null;

    //Use maxResultsPerQuery to limit the number of results per query as desired. `null` will have the query return the entire contents of the blob container
    int? maxResultsPerQuery = null;

    do
    {
        var response = await container.ListBlobsSegmentedAsync(string.Empty, true, BlobListingDetails.None, maxResultsPerQuery, continuationToken, null, null);
        continuationToken = response.ContinuationToken;

        foreach (var blob in response.Results.OfType<CloudAppendBlob>())
        {
            yield return blob;
        }
    } while (continuationToken != null);
}

IAsyncEnumerableの更新

IAsyncEnumerableが.NET Standard 2.1および.NET Core 3.0で利用可能になりました

private static CloudBlobClient _blobClient = CloudStorageAccount.Parse("connectionstring").CreateCloudBlobClient();

public async IAsyncEnumerable<CloudAppendBlob> GetBlobs()
{
    var container = _blobClient.GetContainerReference("$logs");
    BlobContinuationToken continuationToken = null;

    //Use maxResultsPerQuery to limit the number of results per query as desired. `null` will have the query return the entire contents of the blob container
    int? maxResultsPerQuery = null;

    do
    {
        var response = await container.ListBlobsSegmentedAsync(string.Empty, true, BlobListingDetails.None, maxResultsPerQuery, continuationToken, null, null);
        continuationToken = response.ContinuationToken;

        foreach (var blob in response.Results.OfType<CloudAppendBlob>())
        {
            yield return blob;
        }
    } while (continuationToken != null);
}
5
Brandon Minnick

結果セット全体のセグメントと継続トークンを返すListBlobsSegmentedAsyncを使用します。

ref: https://docs.Microsoft.com/en-us/Azure/storage/blobs/storage-quickstart-blobs-dotnet?tabs=windows

3
Shawn Teng

新しいパッケージの使用Azure.Storage.Blobs

BlobServiceClient blobServiceClient = new BlobServiceClient("YourStorageConnectionString");
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("YourContainerName");
var blobs = containerClient.GetBlobs();

foreach (var item in blobs){
    Console.WriteLine(item.Name);
}
1
rc125