如何在不解压缩 zip 文件的情况下从内部档案中读取数据?

How to read data from inner archives without extracting zip file?

我有一个 zip 文件,其中包含内部 zip 文件(例如:ZipFile1.zip->ZipFile2.zip->file.txt)。我想使用 ICSharpCode.SharpZipLib 库读取内部存档文件内容 (file.txt) 的数据而不提取到磁盘。可能吗?如果可能的话,让我知道如何得到这个。

基于 this answer,您可以将 zip 中的文件打开为 Stream。您还可以从 Stream 打开 ZipFile。我相信你能看到它的发展方向。

using (var zip = new ZipFile("ZipFile1.zip"))
{
    var nestedZipEntry = zip.GetEntry("ZipFile2.zip");
    using (var nestedZipStream = zip.GetInputStream(nestedZipEntry))
    using (var nestedZip = new ZipFile(nestedZipStream))
    {
        var fileEntry = nestedZip.GetEntry("file.txt");
        using (var fileStream = nestedZip.GetInputStream(fileEntry))
        using (var reader = new StreamReader(fileStream))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
}

我们在这里做什么:

  1. 打开ZipFile1.zip
  2. 找到 ZipFile2.zip
  3. 的条目
  4. 打开 ZipFile2.zip 作为 Stream
  5. 围绕 nestedZipStream 创建一个新的 ZipFile 对象。
  6. 找到 file.txt
  7. 的条目
  8. 围绕fileStream创建一个StreamReader来读取文本文件。
  9. 读取file.txt的内容并输出到控制台

Try it online - 在此示例中,base64 数据是包含“test.zip”的 zip 文件的二进制数据,而后者又包含“file.txt”。该文本文件的内容是“hello”。

P.S。如果未找到条目,则 GetEntry 将 return 为空。您需要在您编写的任何代码中检查它。它在这里有效,因为我确信这些条目存在于它们各自的档案中。