protected override Stream GetStreamCore(FileMode mode, FileAccess access) { ZipPartStream zps; MemoryStream stream; if (Package.PartStreams.TryGetValue(Uri, out stream)) { zps = new ZipPartStream(Package, stream, access); if (mode == FileMode.Create) { stream.SetLength(0); } return(new ZipPartStream(Package, stream, access)); } stream = new MemoryStream(); try { using (UnzipArchive archive = new UnzipArchive(Package.PackageStream)) { foreach (string file in archive.GetFiles()) { if (file != Uri.ToString().Substring(1)) { continue; } using (Stream archiveStream = archive.GetStream(file)) { int read = 0; byte[] buffer = new byte [Math.Min(archiveStream.Length, 2 * 1024)]; while ((read = archiveStream.Read(buffer, 0, buffer.Length)) != 0) { stream.Write(buffer, 0, read); } } } } } catch { // The zipfile is invalid, so just create the file // as if it didn't exist stream.SetLength(0); } Package.PartStreams.Add(Uri, stream); if (mode == FileMode.Create) { stream.SetLength(0); } return(new ZipPartStream(Package, stream, access)); }
protected override Stream GetStreamCore (FileMode mode, FileAccess access) { ZipPartStream zps; MemoryStream stream; if (Package.PartStreams.TryGetValue (Uri, out stream)) { zps = new ZipPartStream (Package, stream, access); if (mode == FileMode.Create) stream.SetLength (0); return new ZipPartStream (Package, stream, access); } stream = new MemoryStream (); try { using (UnzipArchive archive = new UnzipArchive (Package.PackageStream)) { foreach (string file in archive.GetFiles ()) { if (file != Uri.ToString ().Substring (1)) continue; using (Stream archiveStream = archive.GetStream (file)) { int read = 0; byte[] buffer = new byte [Math.Min (archiveStream.Length, 2 * 1024)]; while ((read = archiveStream.Read (buffer, 0, buffer.Length)) != 0) stream.Write (buffer, 0, read); } } } } catch { // The zipfile is invalid, so just create the file // as if it didn't exist stream.SetLength (0); } Package.PartStreams.Add (Uri, stream); if (mode == FileMode.Create) stream.SetLength (0); return new ZipPartStream (Package, stream, access); }