Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
		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);
		}