首页 > 解决方案 > 如何使用 ICSharpCode.SharpZipLib.Zip 压缩 blob

问题描述

我正在为 C# 使用最新的 azure sdk Azure.Storage.Blobs 版本 12.9.1。我必须将所有 blob 从一个容器移动到另一个容器。我已经列出了所有 blob,但我被困在如何打开输出流以将 blob 写入另一个容器中。

 FileStream fs = File.OpenWrite("\\" + str+"zip");


            using (var zipOutputStream = new ZipOutputStream(fs))
            {
                foreach (var blobFileName in files)
                {
                    zipOutputStream.SetLevel(5);
                    var blob = dirFromZip.GetBlobClient(blobFileName);
                    var entry = new ZipEntry(blobFileName);
                    zipOutputStream.PutNextEntry(entry);
                    blob.DownloadTo(zipOutputStream);
                }
            fs.Position = 0;
            var blobClient = dirwhereZip.GetBlobClient(str);
            blobClient.Upload(fs);
            zipOutputStream.Finish();
                zipOutputStream.Close();
            }
             

错误:System.NotSupportedException:流不支持读取。

标签: azureazure-blob-storage

解决方案


请尝试以下代码:

using System;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;

namespace SO68566758
{
    class Program
    {
        private const string connectionString = "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key";
        private const string sourceContainer = "source-container";
        private const string targetContainer = "target-container";
        private const string outputBlobName = "backup.zip";
        static async Task Main(string[] args)
        {
            BlobServiceClient serviceClient = new BlobServiceClient(connectionString);
            BlobContainerClient sourceContainerClient = serviceClient.GetBlobContainerClient(sourceContainer);
            BlobContainerClient targetContainerClient = serviceClient.GetBlobContainerClient(targetContainer);
            var blobs = sourceContainerClient.GetBlobsAsync();
            using (var fs = new FileStream(outputBlobName, FileMode.OpenOrCreate))
            {
                using (var zipOutputStream = new ZipOutputStream(fs))
                {
                    await foreach (var blob in blobs)
                    {
                        var blobName = blob.Name;
                        var blobClient = sourceContainerClient.GetBlobClient(blobName);
                        //var downloadResponse = await blobClient.DownloadAsync();
                        //var streamContent = downloadResponse.Value.Content;
                        var entry = new ZipEntry(blobName);
                        zipOutputStream.PutNextEntry(entry);
                        await blobClient.DownloadToAsync(zipOutputStream);
                    }
                }
            }

            BlobClient targetBlob = targetContainerClient.GetBlobClient(outputBlobName);
            using (FileStream fs = new FileStream(outputBlobName, FileMode.Open))
            {
                await targetBlob.UploadAsync(fs);
            }
        }
    }
}

推荐阅读