public Read ( byte buffer, int offset, int count ) : int | ||
buffer | byte | An array of bytes. When this method returns, the buffer /// contains the specified byte array with the values between offset and /// (offset + count - 1) replaced by the bytes read from the current source. |
offset | int | The zero-based byte offset in buffer at which to begin /// storing the data read from the current stream. |
count | int | The maximum number of bytes to be read from the current stream. |
return | int |
private long PackFileBytes( IPackStreamContext streamContext, Stream fileStream, long maxArchiveSize, Converter <Stream, Stream> compressionStreamCreator, ref Stream archiveStream, out uint crc) { long writeStartPosition = archiveStream.Position; long bytesWritten = 0; CrcStream fileCrcStream = new CrcStream(fileStream); ConcatStream concatStream = new ConcatStream( delegate(ConcatStream s) { Stream sourceStream = s.Source; bytesWritten += sourceStream.Position - writeStartPosition; this.CheckArchiveWriteStream( streamContext, maxArchiveSize, 1, ref sourceStream); writeStartPosition = sourceStream.Position; s.Source = sourceStream; }); concatStream.Source = archiveStream; if (maxArchiveSize > 0) { concatStream.SetLength(maxArchiveSize); } Stream compressionStream = compressionStreamCreator(concatStream); try { byte[] buf = new byte[4096]; long bytesRemaining = fileStream.Length; int counter = 0; while (bytesRemaining > 0) { int count = (int)Math.Min( bytesRemaining, (long)buf.Length); count = fileCrcStream.Read(buf, 0, count); if (count <= 0) { throw new ZipException( "Failed to read file: " + this.currentFileName); } compressionStream.Write(buf, 0, count); bytesRemaining -= count; this.fileBytesProcessed += count; this.currentFileBytesProcessed += count; this.currentArchiveTotalBytes = concatStream.Source.Position; this.currentArchiveBytesProcessed = this.currentArchiveTotalBytes; if (++counter % 16 == 0) // Report every 64K { this.OnProgress(ArchiveProgressType.PartialFile); } } if (compressionStream is DeflateStream) { compressionStream.Close(); } else { compressionStream.Flush(); } } finally { archiveStream = concatStream.Source; } bytesWritten += archiveStream.Position - writeStartPosition; crc = fileCrcStream.Crc; return(bytesWritten); }
/// <summary> /// Writes compressed bytes of one file to the archive, /// keeping track of the CRC and number of bytes written. /// </summary> private long PackFileBytes( IPackStreamContext streamContext, Stream fileStream, long maxArchiveSize, Converter<Stream, Stream> compressionStreamCreator, ref Stream archiveStream, out uint crc) { long writeStartPosition = archiveStream.Position; long bytesWritten = 0; CrcStream fileCrcStream = new CrcStream(fileStream); ConcatStream concatStream = new ConcatStream( delegate(ConcatStream s) { Stream sourceStream = s.Source; bytesWritten += sourceStream.Position - writeStartPosition; this.CheckArchiveWriteStream( streamContext, maxArchiveSize, 1, ref sourceStream); writeStartPosition = sourceStream.Position; s.Source = sourceStream; }); concatStream.Source = archiveStream; if (maxArchiveSize > 0) { concatStream.SetLength(maxArchiveSize); } Stream compressionStream = compressionStreamCreator(concatStream); try { byte[] buf = new byte[4096]; long bytesRemaining = fileStream.Length; int counter = 0; while (bytesRemaining > 0) { int count = (int) Math.Min( bytesRemaining, (long) buf.Length); count = fileCrcStream.Read(buf, 0, count); if (count <= 0) { throw new ZipException( "Failed to read file: " + this.currentFileName); } compressionStream.Write(buf, 0, count); bytesRemaining -= count; this.fileBytesProcessed += count; this.currentFileBytesProcessed += count; this.currentArchiveTotalBytes = concatStream.Source.Position; this.currentArchiveBytesProcessed = this.currentArchiveTotalBytes; if (++counter % 16 == 0) // Report every 64K { this.OnProgress(ArchiveProgressType.PartialFile); } } if (compressionStream is DeflateStream) { compressionStream.Close(); } else { compressionStream.Flush(); } } finally { archiveStream = concatStream.Source; } bytesWritten += archiveStream.Position - writeStartPosition; crc = fileCrcStream.Crc; return bytesWritten; }