Как извлечь подкаталог с помощью C# DotNetZip?

У меня есть MyFile.zip, у которого есть основной каталог "MyMainFolder", и внутри него несколько подкаталогов, одно из которых я хочу извлечь (MySubFolder)... со всеми его подкаталогами и содержимым.

Я пытаюсь понять, как "войти" в MyMainFolder, чтобы я мог извлечь "MySubFolder".

У меня есть некоторый код, который будет извлекать папку, пока эта папка, которую я ищу, существует в качестве главной папки в zip-архиве... и я могу определить, называется ли главная папка "MyMainFolder", поэтому она знает, что заглядывать внутрь и извлечь оттуда, а не искать в главном почтовом корне для MySubFolder).

using (ZipFile zip1 = ZipFile.Read(fileName))
{
    zipFile = ZipFile.Read(@""+fileName);
    var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));

   if (result == false)
   {
            MessageBox.Show("MyMainFolder detected....Extracting from MyMainFolder...");
            // something here that will extract JUST MySubFolder and contents
   } else {
    foreach (var e in selection)
   {             
           var selection = (from e in zip1.Entries where (e.FileName).Contains("NySubfolder") select e)               
           e.Extract(outputDirectory);        
   }
  }
}

До сих пор я пытался поместить отдельное использование внутри каждой части if-else, и я попытался создать отдельное selectionX, в котором я пытался принудительно заставить имя корневой папки (которое всегда будет "MyMainFolder" для этого эксперимента) быть частью того, что он просматривал, думая, что я мог бы затем извлечь MySubFolder, но я также не мог заставить это работать. Я попытался включить несколько других методов, которые я нашел в stackflow и других случаях, таких как использование частей "как извлечь файлы, но игнорирование пути в zipfile" и других подобных сообщений, чтобы попытаться найти способ "пропустить" этот основной корень папка при распаковке. (чтобы он получал ТОЛЬКО "MySubFolder" (и его содержимое) и извлекал данные в outputDirectory (не MyMainFolder\MySubFolder...)

Любая помощь приветствуется. Спасибо!!

1 ответ

Решение

Перечисление всего содержимого до тех пор, пока я не наткнулся на то, что я искал, сработало, но просто в качестве эксперимента я хотел посмотреть, можно ли это сделать по-другому.

Так как я не смог проверить имена подпапок внутри корневой папки, я решил, что могу просто сопоставить то, что искал, анализируя его, извлекая только то, что хотел, а затем просто изменить путь вывода.

using (ZipFile zip1 = ZipFile.Read(fileName))
{
    zipFile = ZipFile.Read(@""+fileName);
    var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));

    if (result == false)
    {
        // something here that will extract JUST MySubFolder and content
        string TestX = Path.GetDirectoryName(e.FileName) ;
        string MyNewPath = outputDirectory+@"\"+TestX ;
        e.Extract(MyNewPath);
    } else {
        foreach (var e in selection)
   {             
        var selection = (from e in zip1.Entries where (e.FileName).Contains("MySubfolder")
        .select e)               
        e.Extract(outputDirectory);        
   }
}

Как-то так.. Не очень полезно, но интересно и помогло мне немного научиться. (если ничего, пример того, как НЕ делать вещи.. хе-хе) Спасибо

Другие вопросы по тегам