Как я могу удалить каталог в Zip-файле, используя .NET? - PullRequest
3 голосов
/ 25 марта 2012

Как мне удалить каталог в .zip и все файлы в нем (желательно с использованием DotNetZip)?

Сейчас я бегу по всем файлам в zip, но это не такработа:

foreach (ZipEntry e in zip)
{
    //If the file is in the directory I want to delete
    if(e.FileName.Substring(0, 9) == "FolderName/")
    {
        zip.RemoveEntry(e.FileName);                          
    }
}

Есть ли лучший способ, если нет, как бы я сделал эту работу?

Ответы [ 3 ]

7 голосов
/ 25 марта 2012

Первая мысль. Не зацикливайтесь на foreach при удалении элементов из коллекции.
Я попробую таким образом

for(int x = zip.Count -1; x >= 0; x--) 
{ 
    ZipEntry e = zip[x];
    if(e.FileName.Substring(0, 9) == "FolderName/") 
        zip.RemoveEntry(e.FileName);                           
} 

Однако, глядя на методы класса ZipFile, я заметил метод: Выберите Entry, которые возвращают ICollection. Поэтому я думаю, что можно сделать:
РЕДАКТИРОВАТЬ: использовать перегруженную версию SelectEntries (строка, строка)

var selection = zip1.SelectEntries("*.*", "FolderName");
for(x = selection.Count - 1; x >= 0; x--)
{
    ZipEntry e = selection[x];
    zip.RemoveEntry(e.FileName);                           
}

удаление цикла для всех записей в zipfile

6 голосов
/ 04 сентября 2014

Вот простой способ сделать это:

using (ZipFile zip = ZipFile.Read(@"C:\path\to\MyZipFile.zip"))
{
    zip.RemoveSelectedEntries("foldername/*"); // Delete folder and its contents
    zip.Save();
}

Документация здесь http://dotnetzip.herobo.com/DNZHelp/Index.html

0 голосов
/ 12 июня 2016

Чтобы удалить каталог и все вложенные дочерние записи, я использовал

var sel = (from x in zip.Entries where x.FileName.StartsWith(path, StringComparison.OrdinalIgnoreCase) select x.FileName).ToList();
foreach (var fn in sel)
{
     zip.RemoveEntry(fn);
}

Обратите внимание, что путь должен заканчиваться косой чертой, например dir/subdir/

...