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

C# 如何在不提取zip文件的情况下从内部存档读取数据?,c#,.net,sharpziplib,C#,.net,Sharpziplib,我有一个包含内部zip文件的zip文件(例如:ZipFile1.zip->ZipFile2.zip->file.txt)。我想使用ICSharpCode.SharpZipLib库读取内部归档文件内容(file.txt)的数据,而不提取到磁盘。可能吗?如果可能的话,请告诉我如何获取此信息。基于,您可以在zip中以流的形式打开文件。您还可以从流中打开ZipFile。我相信你能看到这一切的发展方向 using (var zip = new ZipFile("ZipFile1.zip"

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

基于,您可以在zip中以
流的形式打开文件。您还可以从
中打开
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作为
    流打开
  • nestedZipStream
    周围创建一个新的
    ZipFile
    对象
  • 查找file.txt的条目
  • 围绕
    fileStream
    创建
    StreamReader
    以读取文本文件
  • 读取file.txt的内容并将其输出到控制台
  • -在本示例中,base64数据是包含“test.zip”的zip文件的二进制数据,而zip文件又包含“file.txt”。该文本文件的内容是“hello”


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

    这是否回答了您的问题?也许这个答案可以帮助您:您已经在提取文件了。不将它们写入磁盘并不意味着不提取它们来读取它们。打开一个指向所需条目的流,并使用SharpZibLib@Llama. 谢谢你的更新。我已经试过了,但读取嵌套存档文件内容无效。如果您接受嵌套存档只是包含存档的另一个文件,则读取嵌套存档文件效果很好。我添加了一个答案,证明它是有效的。感谢您的即时回复。我解决了我的问题。问题:当我尝试同样的方法时,我得到以下错误“流不可查找参数名:nestedZipStream”。由于nestedZipStream.CanSeek值为false。解决方案:将nestedZipStream复制到MemoryStream,这样我就可以为nestedZipStream创建ZipFile并读取ZipFile条目。啊,是的。您可以在源流上检查
    .CanSeek
    ,查看它是否可查找,并且仅在不可查找时进行复制。