2013-07-10 3 views
4

Предположим, у меня есть zip-файл, содержащий 10 текстовых файлов. Это легко перебрать эти текстовые файлы с помощью:Зацикливание файлов в подкаталогах ZIP-архива

using (ZipArchive archive = ZipFile.OpenRead(zipIn)) 
{ 
    foreach (ZipArchiveEntry entry in archive.Entries) 
    { 
     Console.writeLine(entry) 
    } 
} 

Однако предположит, что текстовые файлы находятся в подкаталоге:

zip/subdirectory/file1.txt 

В этом случае приведенный выше код выводит только в папке поддиректории («подкаталог»), в отличие от всех текстовых файлов в этой папке.

Есть ли простой способ перебора файлов в подкаталоге?

+1

Попробуйте с помощью рекурсии. –

ответ

7

Я воспроизвел свою программу. Когда я перебираю zip-архив так, как вы это делаете, я получаю список всех файлов в полной структуре каталогов в архиве. Таким образом, вам не нужна рекурсия, просто повторяйте, как вы делаете сейчас.

Я понимаю ваше замешательство, поскольку API не делает различия между файлами и папками. Вот метод расширения, чтобы помочь:

static class ZipArchiveEntryExtensions 
{ 
    public static bool IsFolder(this ZipArchiveEntry entry) 
    { 
     return entry.FullName.EndsWith("/"); 
    } 
} 

Тогда вы можете сделать:

using (var archive = ZipFile.OpenRead("bla.zip")) 
{ 
    foreach (var s in archive.Entries) 
    { 
     if (s.IsFolder()) 
     { 
      // do something special 
     } 

    } 
} 
2

Я не могу воспроизвести вашу проблему. Он отлично работает в моем тесте:

using (var archive = ZipFile.OpenRead(zipIn)) 
{ 
    foreach (var zipArchiveEntry in archive.Entries) 
    { 
     Console.WriteLine(zipArchiveEntry); 
    } 
} 
Console.ReadLine(); 

Результат:

enter image description here

Смежные вопросы