/// <summary> /// Removes one of many files in storage. It creates a new Zip file. /// </summary> /// <param name="zip">Reference to the current Zip object</param> /// <param name="zfes">List of Entries to remove from storage</param> /// <returns>True if success, false if not</returns> /// <remarks>This method only works for storage of type FileStream</remarks> public static bool removeEntries(ref ZipStorer zip, List<ZipFileEntry> zfes) { if (!(zip.zipFileStream is FileStream)) throw new InvalidOperationException("RemoveEntries is allowed just over streams of type FileStream"); //Get full list of entries List<ZipFileEntry> fullList = zip.readCentralDir(); //In order to delete we need to create a copy of the zip file excluding the selected items string tempZipName = Path.GetTempFileName(); string tempEntryName = Path.GetTempFileName(); try { ZipStorer tempZip = ZipStorer.create(tempZipName, string.Empty); foreach (ZipFileEntry zfe in fullList) { if (!zfes.Contains(zfe)) { if (zip.extractFile(zfe, tempEntryName)) { tempZip.addFile(zfe.method, tempEntryName, zfe.filenameInZip, zfe.comment); } } } zip.close(); tempZip.close(); File.Delete(zip.fileName); File.Move(tempZipName, zip.fileName); zip = ZipStorer.open(zip.fileName, zip.access); } catch { return false; } finally { if (File.Exists(tempZipName)) File.Delete(tempZipName); if (File.Exists(tempEntryName)) File.Delete(tempEntryName); } return true; }