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