如何在Azure.Storage.Blobs v12 SDK中替代CloudBlockBlob.OpenWriteAsync()
Azure.Storage.Blobs v12.13.1 替代 CloudBlockBlob.OpenWriteAsync() 的流式处理方案
核心替代方案
在Azure.Storage.Blobs v12中,CloudBlockBlob.OpenWriteAsync()的直接替代是BlobClient.OpenWriteAsync(),结合v12 SDK的新类型(BlobContainerClient、BlobClient)即可保留流式处理逻辑,无需修改核心的ZipArchive和缓冲写入逻辑。
修改后的完整代码
// 替换旧的CloudBlobContainer为v12的BlobContainerClient private readonly BlobContainerClient _container; public async Task<(string, int)> StoreCsvCollectionAsZipAsync(string zipFileName, IEnumerable<(string, IEnumerable<string>)> csvCollection) { var blobClient = _container.GetBlobClient(zipFileName); // 可选:保留原有的删除逻辑,或在OpenWrite时设置overwrite:true await blobClient.DeleteIfExistsAsync(); var maxRowCount = 0; const int bufferCapacityLines = 100; var bufferLinesCount = 0; var rowsBuffer = new StringBuilder(); // 使用BlobClient.OpenWriteAsync替代旧的OpenWriteAsync await using (var uploadStream = await blobClient.OpenWriteAsync(overwrite: false)) // 已提前删除,设为false;若不删则设为true直接覆盖 { using (var zipArchive = new ZipArchive(uploadStream, ZipArchiveMode.Create)) { foreach (var (tableName, csvRows) in csvCollection) { var rowCount = 0; var zipArchiveEntry = zipArchive.CreateEntry(tableName); await using var innerFile = zipArchiveEntry.Open(); foreach (var csvRow in csvRows) { // 原有缓冲写入逻辑保持不变 rowsBuffer.AppendLine(csvRow); bufferLinesCount++; rowCount++; if (bufferLinesCount >= bufferCapacityLines) { var bytes = Encoding.UTF8.GetBytes(rowsBuffer.ToString()); await innerFile.WriteAsync(bytes); rowsBuffer.Clear(); bufferLinesCount = 0; } } if (rowsBuffer.Length > 0) { var finalBytes = Encoding.UTF8.GetBytes(rowsBuffer.ToString()); await innerFile.WriteAsync(finalBytes); rowsBuffer.Clear(); } if (maxRowCount < rowCount) maxRowCount = rowCount; } } } var uri = GetSharedAccessUri(zipFileName); return (uri?.ToString() ?? "", maxRowCount); }
关键修改点说明
- 容器类型替换:将旧版的
CloudBlobContainer替换为v12 SDK的BlobContainerClient,这是v12 SDK的核心容器操作类型。 - Blob实例获取:使用
_container.GetBlobClient(zipFileName)替代旧的GetBlockBlobReference,获取v12对应的BlobClient实例。 - 流式写入替换:
BlobClient.OpenWriteAsync()返回Task<BlobWriteStream>,与旧版的流类型用法完全兼容,可直接传入ZipArchive进行流式压缩写入。 - 覆盖逻辑优化:如果不需要提前删除Blob,可以直接在
OpenWriteAsync中设置overwrite: true,省去DeleteIfExistsAsync的调用,简化代码。
内容的提问来源于stack exchange,提问作者KVN
相关产品推荐
相关产品推荐

