c# - 不完整的 zip 文件创建 C#
问题描述
我遵循从 S3 中提取文件并将它们压缩到 S3 的代码。我看到的问题是在创建最终的 zip 文件时,它总是缺少几百个文件。不知道错误在哪里,在哪里。对于未压缩的文件,不会出现任何错误。
代码:
public static async Task StartCompressionLargeDataSetAsync(string dirToZip, int zipBatchSize, List<List<string>> listOf_listOf_pdfFiles, IAmazonS3 s3Client)
{
using MemoryStream memoryStream = new MemoryStream();
foreach (var batch in listOf_listOf_pdfFiles)
await CreateLargeDataSetZipFileAsync(memoryStream, Function.bucket, batch, Function.s3Client);
memoryStream.Seek(0, SeekOrigin.Begin);
var fileTxfrToS3 = new TransferUtility(s3Client);
await fileTxfrToS3.UploadAsync(memoryStream, Function.bucket, $"{Function.prefix}{dirToZip}");
LambdaLogger.Log($"Successfully created {dirToZip}");
memoryStream.Close();
}
public static async Task CreateLargeDataSetZipFileAsync(MemoryStream stream, string bucket, List<string> pdfFileSet, IAmazonS3 s3Client)
{
var task = pdfFileSet.Select(async pdfFile =>
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucket,
Key = pdfFile
};
using GetObjectResponse response = await s3Client.GetObjectAsync(request);
using Stream responseStream = response.ResponseStream;
ZipArchiveEntry zipFileEntry = zipArchive.CreateEntry(pdfFile.Split('/')[^1]);
using Stream zipEntryStream = zipFileEntry.Open();
await responseStream.CopyToAsync(zipEntryStream);
}).ToList();
await Task.WhenAll(task);
}
解决方案
ZipArchive
不是线程安全的。您一次只能将一个文件添加到 zip 存档中。
您可以尝试同时下载多个文件,然后在每个文件完成时对其进行压缩,但这样做的缺点是在压缩时将每个文件完全保存在内存中。
推荐阅读
- spring - 有什么方法可以用 RestTemplate 处理 Stream Json?
- javascript - HTML5 Canvas Compression 的 DataURL() 输出的尺寸比原始尺寸大
- javascript - 如果选中或未选中单选按钮,则启用或禁用按钮
- mysql - MYSQL更新具有重复值但最旧日期的行
- webpack - Webpack-Dev-Server 抛出 WDS 断开连接
- javascript - 仅当数据来自循环的 GET 请求时,JSON stringify 才会失败
- angular - 如何使用角度通过带有jwt令牌的rest调用下载文件
- python - Python:从多个创建输出 CSV。查找
- javascript - Angular 全局错误处理程序将 error.message 打印为错误本身
- python - 在 Python 中计算航空公司排名 - NameError: name is not defined