如何在Azure中获取容器中所有blob的列表?

18

我有一个Azure存储帐户的帐户名称和帐户密钥。 我需要获取该帐户下容器中所有Blob的列表("$ logs"容器)。

使用CloudBlobClient类可以获取特定Blob的信息,但无法找出如何获取$ logs容器中的所有Blob的列表。

6个回答

23

以下是如何列出容器中所有 blob 的示例:https://azure.microsoft.com/zh-cn/documentation/articles/storage-dotnet-how-to-use-blobs/#list-the-blobs-in-a-container

// Retrieve the connection string for use with the application. The storage
// connection string is stored in an environment variable on the machine
// running the application called AZURE_STORAGE_CONNECTION_STRING. If the
// environment variable is created after the application is launched in a
// console or with Visual Studio, the shell or application needs to be closed
// and reloaded to take the environment variable into account.
string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

// Create a BlobServiceClient object which will be used to create a container client
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

// Get the container client object
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("yourContainerName");

// List all blobs in the container
await foreach (BlobItem blobItem in containerClient.GetBlobsAsync())
{
    Console.WriteLine("\t" + blobItem.Name);
}    

7
ListBlobs 方法不可用,建议使用 ListBlobsSegmentedAsync 方法,原意不变,语言通俗易懂。 - Michael Freidgeim
1
截至2020年,答案是:https://dev59.com/kFwY5IYBdhLWcg3w7rdX#60326935。 - d_f

10

使用新的包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
Azure.Storage.Blob - codah

9

以下是 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);
}

1
这是检索大于5000个blob列表的最佳答案。 - John Bonfardeci

7

由于您的容器名称为 $logs,所以我认为您的 Blob 类型是追加 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。需要注意的一点是,参数useFlatBlobListing需要设置为true,这意味着ListBlobs将返回一个扁平的文件列表,而不是一个层次结构列表。


4

0
在Web API中,Swagger是一个很有用的工具。
    [HttpGet(nameof(GetFileList))]
    public async Task<IActionResult> GetFileList()
    {
        BlobServiceClient blobServiceClient = new BlobServiceClient(_configuration.GetValue<string>("BlobConnectionString"));
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_configuration.GetValue<string>("BlobContainerName"));
        var blobs = containerClient.GetBlobs();
        return Ok(blobs);
        
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接