如何使用Azure.Storage.Blobs枚举大型Azure BLOB容器?
使用Azure.Storage.Blobs借助续传令牌枚举大型Blob容器的代码示例
在Azure.Storage.Blobs SDK中,AsyncPageable<BlobItem>提供了分页枚举能力,虽然GetBlobsAsync方法没有直接暴露续传令牌参数,但可以通过AsPages()方法手动控制分页并获取/传入续传令牌,实现大型容器的断点续扫。
完整代码示例
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using System; using System.IO; using System.Linq; using System.Threading.Tasks; public static async Task ScanBlobsWithContinuation() { // 替换为你的存储连接字符串和容器名称 string storageConnectionString = "your-storage-connection-string"; string containerName = "target-container"; BlobContinuationToken continuationToken = null; // 可选:从之前保存的位置恢复续传令牌 // string savedToken = File.ReadAllText("continuation-token.txt"); // continuationToken = BlobContinuationToken.Deserialize(savedToken); var containerClient = new BlobContainerClient(storageConnectionString, containerName); do { // 获取当前分页的Blob数据及续传令牌 var currentPage = await containerClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, continuationToken) .AsPages() .FirstOrDefaultAsync(); if (currentPage == null) break; // 处理当前页的Blob项 foreach (var blob in currentPage.Values) { Console.WriteLine($"Blob: {blob.Name} | 大小: {blob.Properties.ContentLength} bytes"); // 这里添加自定义业务逻辑 } // 更新续传令牌 continuationToken = currentPage.ContinuationToken; // 可选:将续传令牌保存到本地文件,用于后续断点恢复 if (continuationToken != null) { string tokenJson = continuationToken.Serialize(); File.WriteAllText("continuation-token.txt", tokenJson); } } while (continuationToken != null); Console.WriteLine("Blob枚举完成"); }
断点续扫说明
如果需要从中断的位置继续扫描,只需读取之前保存的续传令牌字符串,反序列化后传入即可:
// 读取保存的续传令牌 string savedToken = File.ReadAllText("continuation-token.txt"); BlobContinuationToken restoredToken = BlobContinuationToken.Deserialize(savedToken); // 传入restoredToken到GetBlobsAsync的AsPages方法,即可从断点处继续枚举
关键要点
AsPages()方法支持传入BlobContinuationToken,是实现断点续扫的核心BlobContinuationToken的Serialize()和Deserialize()方法可将令牌转为字符串持久化,方便断点恢复- 每次分页返回的
Page<BlobItem>包含当前页的Blob列表和下一页的续传令牌,直到令牌为null时表示枚举完成
内容的提问来源于stack exchange,提问作者joelc
相关产品推荐
相关产品推荐

