/// <summary> /// This methods extract a zip file in the given directory /// </summary> /// <param name="filePath"></param> /// <param name="targetDir"></param> public static bool ExtractAll(string filePath, string targetDir) { if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) { return(false); } if (!CreateDirectory(targetDir)) { return(false); } bool result = true; try { // Opens existing zip file using (ZipStorer zip = ZipStorer.Open(filePath, FileAccess.Read)) { // Extract all files in target directory foreach (ZipStorer.ZipFileEntry entry in zip.ReadCentralDir()) { var outputPath = Path.Combine(targetDir, entry.FilenameInZip); if (!CreateDirectory(Path.GetDirectoryName(outputPath))) { return(false); } result = result && zip.ExtractFile(entry, outputPath); } } } catch (Exception e) { ErrorHandler.ShowErrors(e, "Unzipping " + Path.GetFileName(filePath)); result = false; } return(result); }
/// <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); }