如何解决如何在不提取 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());
}
}
}
我们在这里做什么:
- 打开 ZipFile1.zip
- 找到 ZipFile2.zip 的条目
- 打开 ZipFile2.zip 作为
Stream
- 围绕
ZipFile
创建一个新的nestedZipStream
对象。 - 找到 file.txt 的条目
- 在
StreamReader
周围创建一个fileStream
以读取文本文件。 - 读取 file.txt 的内容并将其输出到控制台。
Try it online - 在此示例中,base64 数据是包含“test.zip”的 zip 文件的二进制数据,而后者又包含“file.txt”。该文本文件的内容是“你好”。
附言如果未找到条目,则 GetEntry
将返回 null。您需要在您编写的任何代码中检查这一点。它在这里工作是因为我确信这些条目存在于它们各自的档案中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。