How would I delete a directory in a .zip and all the files in it (preferably using DotNetZip)?
Right now I'm running through all the files in the zip, but it doesn't work:
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);
}
}
Is there a better way, if not, how would I make this work?
First tought. Don't loop with foreach while removing elements from the collection.
I will try in this way
for(int x = zip.Count -1; x >= 0; x--)
{
ZipEntry e = zip[x];
if(e.FileName.Substring(0, 9) == "FolderName/")
zip.RemoveEntry(e.FileName);
}
However, looking at the methods of the ZipFile class, I noticed the method:
SelectEntries that return a ICollection. So I think it's possible to do:
EDIT: Use overloaded version SelectEntries(string,string)
var selection = zip1.SelectEntries("*.*", "FolderName");
for(x = selection.Count - 1; x >= 0; x--)
{
ZipEntry e = selection[x];
zip.RemoveEntry(e.FileName);
}
removing the loop on all entries in the zipfile
Here's a simple way to do this:
using (ZipFile zip = ZipFile.Read(@"C:\path\to\MyZipFile.zip"))
{
zip.RemoveSelectedEntries("foldername/*"); // Delete folder and its contents
zip.Save();
}
Documentation here http://dotnetzip.herobo.com/DNZHelp/Index.html
In order to delete the directory and all nested child entries, I used
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);
}
Note that the path must end with a slash, like dir/subdir/