Come posso cancellare una directory in un file Zip usando .NET?

Come cancellerei una directory in un file .zip e tutti i file in essa contenuti (preferibilmente utilizzando DotNetZip)?

In questo momento sto scorrendo tutti i file nello zip, ma non funziona:

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

C’è un modo migliore, se no, come faccio a fare questo lavoro?

Prima pensavo. Non eseguire il loop con foreach durante la rimozione di elementi dalla raccolta.
Proverò in questo modo

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

Tuttavia, osservando i metodi della class ZipFile, ho notato il metodo: SelectEntries che restituisce un ICollection. Quindi penso che sia ansible fare:
MODIFICA: utilizzare la versione sovraccaricata SelectEntries (stringa, stringa)

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

rimuovendo il ciclo su tutte le voci nel file zip

Ecco un modo semplice per farlo:

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

Documentazione qui http://dotnetzip.herobo.com/DNZHelp/Index.html

Ho usato per cancellare la directory e tutte le voci figlio annidate

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

Nota che il percorso deve terminare con una barra, come dir/subdir/