Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不提取的情况下递归探索zip文件内容_C#_Recursion_Zip - Fatal编程技术网

C# 如何在不提取的情况下递归探索zip文件内容

C# 如何在不提取的情况下递归探索zip文件内容,c#,recursion,zip,C#,Recursion,Zip,我想写一个函数,它将探索一个ZIP文件,并将发现它是否包含一个.png文件。问题是,它还应该探索父zip中可能包含的zip文件(也来自其他zip文件和文件夹) 似乎这还不够痛苦,任务必须在不提取任何zip文件(父文件或子文件)的情况下完成 我想写这样的东西(半伪): 问题是,我找不到一种方法来探索内部zip文件而不提取文件,这是必须的先决条件(不提取文件) 提前谢谢 正如我在问题中指出的,我将您的基本上标记为“复制”,您需要打开内部zip文件 我将您的“从文件打开”方法更改为: // Open

我想写一个函数,它将探索一个ZIP文件,并将发现它是否包含一个.png文件。问题是,它还应该探索父zip中可能包含的zip文件(也来自其他zip文件和文件夹)

似乎这还不够痛苦,任务必须在不提取任何zip文件(父文件或子文件)的情况下完成

我想写这样的东西(半伪):

问题是,我找不到一种方法来探索内部zip文件而不提取文件,这是必须的先决条件(不提取文件)


提前谢谢

正如我在问题中指出的,我将您的基本上标记为“复制”,您需要打开内部zip文件

我将您的“从文件打开”方法更改为:

// Open ZipArchive from a file
public bool findPng(zipPath) {
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))    
    {
        return findPng(archive);
    }
}
然后有一个单独的方法,它接受一个
ZipArchive
,这样您就可以通过将条目作为
流打开来递归调用它


作为优化,我建议在处理嵌套zip文件之前检查所有文件名

如果不进行任何解压缩,就无法浏览内部zip文件。从单个
.zip
条目中打开一个流,并用它创建一个新的
ZipArchive
对象,应该允许您以最少的必要提取来完成。我重新解释了您的问题,表示您不想将内部zip提取到文件中,而不是反对其解压缩(这就是我认为你所说的摘录)并且相信链接问题的内容以及它的第一条评论是你所需要的。如果链接的副本没有回答你的问题,请编辑你的问题来解释如何,然后在评论中标记我(@john)我会重新回答你的问题。谢谢你,约翰。这个链接没有回答我的问题,因为我特别指出了不提取的必要性。你给我的链接在这方面没有帮助,所以我的问题不是重复的,而是不同需求的不同问题(我以前看到过这个问题).至于您的答案:您是否100%肯定无法完成?可能stackoverflow的其他用户认为可以完成?这取决于zipfile。在“正常”压缩下,包含的zipfile将按原样存储(
COMP\u storage
)这些文件中的文件列表仍然可以在不解压缩或提取文件的情况下读取(每个zipfile都包含一个
dirEntry
列表)。这需要了解zipfile结构和一些用户代码(我认为没有用于此的库).Hi@john。谢谢你的广泛帮助。我会检查你的代码,看看它是否对我有用@john。想让你知道你的代码工作完美,帮了我很多(只需要在函数声明中添加“static”)。非常感谢你的关心和广泛帮助!!!
// Open ZipArchive from a file
public bool findPng(zipPath) {
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))    
    {
        return findPng(archive);
    }
}
// Search ZipArchive for PNG
public bool findPng(ZipArchive archive)
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
         string s = entry.FullName;
         if (s.EndsWith(".zip")) 
         {
             // Open inner zip and pass to same method
             using (ZipArchive innerArchive = new ZipArchive(entry.Open()))
             {
                 if (findPng(innerArchive))
                    return true;
             }
         }
         /* same as above with folders within the zip */

         if(s.EndsWith(".png"))
           return true;
       }
       return false;
    }
}