如何在不解压缩 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());
}
}
}
我们在这里做什么:
- 打开ZipFile1.zip
- 找到 ZipFile2.zip
的条目
- 打开 ZipFile2.zip 作为
Stream
- 围绕
nestedZipStream
创建一个新的 ZipFile
对象。
- 找到 file.txt
的条目
- 围绕
fileStream
创建一个StreamReader
来读取文本文件。
- 读取file.txt的内容并输出到控制台
Try it online - 在此示例中,base64 数据是包含“test.zip”的 zip 文件的二进制数据,而后者又包含“file.txt”。该文本文件的内容是“hello”。
P.S。如果未找到条目,则 GetEntry
将 return 为空。您需要在您编写的任何代码中检查它。它在这里有效,因为我确信这些条目存在于它们各自的档案中。
我有一个 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());
}
}
}
我们在这里做什么:
- 打开ZipFile1.zip
- 找到 ZipFile2.zip 的条目
- 打开 ZipFile2.zip 作为
Stream
- 围绕
nestedZipStream
创建一个新的ZipFile
对象。 - 找到 file.txt 的条目
- 围绕
fileStream
创建一个StreamReader
来读取文本文件。 - 读取file.txt的内容并输出到控制台
Try it online - 在此示例中,base64 数据是包含“test.zip”的 zip 文件的二进制数据,而后者又包含“file.txt”。该文本文件的内容是“hello”。
P.S。如果未找到条目,则 GetEntry
将 return 为空。您需要在您编写的任何代码中检查它。它在这里有效,因为我确信这些条目存在于它们各自的档案中。