/// <summary> /// /// </summary> /// <param name="_stream"></param> /// <param name="_access"></param> /// <returns></returns> /// <exception cref="InvalidOperationException"></exception> /// <exception cref="InvalidDataException"></exception> public static Redline Open(Stream _stream, FileAccess _access) { if (!_stream.CanSeek && _access != FileAccess.Read) throw new InvalidOperationException("Stream cannot seek."); Redline zip = new Redline(); zip.ZipFileStream = _stream; zip.Access = _access; if (zip.ReadFileInfo()) return zip; throw new System.IO.InvalidDataException(); }
/// <summary> /// /// </summary> /// <param name="_zip"></param> /// <param name="_zfes"></param> /// <returns></returns> /// <exception cref="InvalidOperationException"></exception> public static bool RemoveEntries(ref Redline _zip, List<ZipFileEntry> _zfes) { if (!(_zip.ZipFileStream is FileStream)) throw new InvalidOperationException("RemoveEntries is only allowed to be used over FileStream type streams."); List<ZipFileEntry> fullList = _zip.ReadCentralDir(); string tempZipName = Path.GetTempFileName(); string tempEntryName = Path.GetTempFileName(); try { Redline tempZip = Redline.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 = Redline.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; }
/// <summary> /// /// </summary> /// <param name="_stream"></param> /// <param name="_comment"></param> /// <returns></returns> public static Redline Create(Stream _stream, string _comment) { Redline zip = new Redline(); zip.Comment = _comment; zip.ZipFileStream = _stream; zip.Access = FileAccess.Write; return zip; }