首页 > 解决方案 > 如何在 Azure Blob 存储中提取多卷存档?

问题描述

我有一个存储在 Azure Blob 存储中的多卷存档,它被分成一系列标题如下的 zip:Archive-Name.zip.001、Archive-Name.zip.002 等。. 存档名称.zip.010。每个文件为 250 MB,包含数百个 PDF。

目前我们正在尝试遍历每个存档部分并提取 PDF。除非存档中的过去 PDF 在两个存档部分之间拆分,否则此方法有效,C# 中的 ZipFile 无法处理拆分文件并引发异常。

我们尝试将所有存档部分读入单个 MemoryStream,然后提取文件,但是我们发现内存流超过了 2GB,这是限制 - 所以这种方法也不起作用。

将档案下载到机器内存中,提取,然后将 PDF 上传到新文件是不可行的。提取需要在运行程序的 Azure 中完成。

这是我们当前使用的代码 - 它无法处理拆分为两个存档部分的 PDF。

 public static void UnzipTaxForms(TextWriter log, string type, string fiscalYear)
    {
        var folderName = "folderName";
        var outPutContainer = GetContainer("containerName");
        CreateIfNotExists(outPutContainer);
        var fileItems = ListFileItems(folderName);

        fileItems = fileItems.Where(i => i.Name.Contains(".zip")).ToList();

        foreach (var file in fileItems)
        {
            using (var ziped = ZipFile.Read(GetMemoryStreamFromFile(folderName, file.Name)))
            {
                foreach (var zipEntry in ziped)
                {
                    using (var outPutStream = new MemoryStream())
                    {
                        zipEntry.Extract(outPutStream);
                        var blockblob = outPutContainer.GetBlockBlobReference(zipEntry.FileName);
                        outPutStream.Seek(0, SeekOrigin.Begin);
                        blockblob.UploadFromStream(outPutStream);
                    }
                }
            }
        }
    }

另一个注意事项。我们无法更改多卷存档的生成方式。任何帮助,将不胜感激。

标签: c#.netazurezipazure-storage

解决方案


推荐阅读