azure - 如何使用 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:流不支持读取。
解决方案
请尝试以下代码:
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);
}
}
}
}
推荐阅读
- spring - 如何在 MockK 中实现类似 @Capturing 的行为?
- python - 从另一个字典中的嵌套字典中提取信息
- django - Elastic Beanstalk 找不到/使用我的 requirements.txt 文件,因此找不到模块“django”
- arrays - 将数组从 AppDelegate 传递到视图控制器
- angularjs - 使用 DotNetNuke DnnApiController 我无法使用 $http.post 命令检索发布数据,但 .ajax 有效
- r - 比较 2 个数据表对并根据第二个数据表更正第一个数据表中的值
- jquery - jquery api调用显示空白返回
- php - 使用 mysqli_insert_id 提取最近自动生成的 ID 时,Mysqli/PHP/HTML 重复插入记录
- php - 为什么内存使用统计中没有锯齿形状?
- node.js - 声明路由时出现一般“NodeJs/express”错误(TypeError:无法读取 pathtoRegexp 处未定义的属性“长度”)