You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:20:48