首页 > 解决方案 > 不完整的 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);
}

标签: c#asynchronousasync-await

解决方案


ZipArchive不是线程安全的。您一次只能将一个文件添加到 zip 存档中。

您可以尝试同时下载多个文件,然后在每个文件完成时对其进行压缩,但这样做的缺点是在压缩时将每个文件完全保存在内存中。


推荐阅读