如何解压缩内存中的文件并检索特定文件

问题描述 投票:0回答:1

我有一个 .NET 8 控制台应用程序。我需要读取文件路径中的数千个 zip 文件。每个 zip 文件都包含未知的文件结构,最终包含 pdf 文件。其中一些 pdf 需要在单独的方法中组合,我正在使用 iTextSharp。

示例 zip 文件内容如下:

engineering\data\foo\prod\new orders\01234\1.pdf
engineering\data\foo\prod\new orders\01234\2.pdf
engineering\data\foo\prod\new orders\01234\some.csv
engineering\data\foo\prod\new orders\01234\3.pdf
engineering\data\foo\prod\new orders\01234\some.txt

zip 文件中的最终目录将包含 txt、csv 和 pdf 文件。我只关心 pdf。

将文件解压到内存然后读取 pdf 的最有效方法是吗?

如果有例子,我们将不胜感激。预先感谢。

这是我到目前为止所拥有的。显然这还不起作用。

public static void ProcessZipFile(string zipFilePath)
{
   List<File> pdfs = new List<File>();

   using(var file = File.OpenRead(zipFilePath))
   using(var zip = new ZipArchive(file, ZipArchiveMode.Read))
   {
      foreach(var entry in zip.Entries)
      {
         if (entry.FullName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
         {
            using (var stream = entry.Open())
            {
               using (var ms = new MemoryStream())
               {
                  stream.CopyTo(ms);
                  ms.Position = 0; // rewind
                  // write memory string to a file in memory in my list
                  ms.WriteTo(pdf);
               }
            }
         }
      }
   }
}
c# zip unzip ziparchive .net-8.0
1个回答
0
投票

在 Windows 中,您无法阅读 ZIP 格式的 PDF。必须将其解压为可解压缩的可查找文件的系统对象。

解压 .zip 的本机命令方式是通过 TAR.exe,因此我们可以将文件类型定位为仅提取 *.pdf

此时您已经有了传统的文件对象,您可以通过文件查找来操作它们。然后解密、解压缩和解码 BL 对象,例如内部文件流。现在解压的流可以转换为可渲染的对象,例如图像文件或文件附件。
基本上,您正在处理也深深嵌套在其中的文件包装器。因此,在您可以说这是位置 0 之前,整个堆栈需要将其视为一个又一个的文件流。

一旦你有了这些 pdf 对象,你需要一个 pdf 合并实用程序来将它们的页面交错成一个新的文件对象。

因此整个任务非常消耗资源字节。最好在内存限制之外完成,使用专为文件 IO 设计的本机磁盘操作系统容量,而不是高速线程应用程序使用所需的有限内存。

© www.soinside.com 2019 - 2024. All rights reserved.