Как рекурсивно искать содержимое zip-файла без извлечения - PullRequest
0 голосов
/ 06 мая 2020

Я хочу написать функцию, которая будет исследовать ZIP-файл и определять, содержит ли он файл .png. Проблема в том, что он также должен исследовать содержащиеся в нем zip-файлы, которые могут находиться в родительском zip-архиве (также из других zip-файлов и папок). zip-файлы, родительские или дочерние.

Я хотел бы написать что-то вроде этого (полу псевдо):

public bool findPng(zipPath) {
    bool flag = false;
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))    
    {
       foreach (ZipArchiveEntry entry in archive.Entries)
       {
         string s = entry.FullName;
         if (s.EndsWith(".zip")) 
         {
             /* recoursively calling findPng */
             flag = findPng(s);
             if (flag == true)
             return true;
         }
         /* same as above with folders within the zip */

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

Проблема в том, что я не могу найти способ изучить внутренний zip файлы без извлечения файла, что является обязательным условием (чтобы файл не извлекался).

Заранее благодарим!

1 Ответ

1 голос
/ 06 мая 2020

Как я указал в вопросе, я пометил ваш в основном как дубликат, вам нужно открыть внутренний zip-файл.

Я бы изменил ваш метод «открыть из файла» следующим образом:

// Open ZipArchive from a file
public bool findPng(zipPath) {
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))    
    {
        return findPng(archive);
    }
}

И затем есть отдельный метод, который принимает ZipArchive, чтобы вы могли вызывать его рекурсивно, открывая запись как Stream как , продемонстрированную здесь

// 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;
    }
}

В качестве оптимизации я бы рекомендовал проверить все имена файлов перед обработкой вложенных zip-файлов.

...