微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个包含内部 zip 文件的 zip 文件(例如:ZipFile1.zip->ZipFile2.zip->file.txt)。我想使用 ICSharpCode.SharpZipLib 库读取内部存档文件内容 (file.txt) 的数据而不提取到磁盘。是否有可能?如果可能,请告诉我如何获得。

解决方法

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

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. 打开 ZipFile2.zip 作为 Stream
  4. 围绕 ZipFile 创建一个新的 nestedZipStream 对象。
  5. 找到 file.txt 的条目
  6. StreamReader 周围创建一个 fileStream 以读取文本文件。
  7. 读取 file.txt 的内容并将其输出到控制台。

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

附言如果未找到条目,则 GetEntry 将返回 null。您需要在您编写的任何代码中检查这一点。它在这里工作是因为我确信这些条目存在于它们各自的档案中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。