public override int Read(byte[] buffer, int offset, int count) { if (count == 0) { return(0); } if (Position + count > Length) // Length will send HTTP request { return(0); } int rem; var pagesToRead = Math.DivRem(_offset + count, PageBlobAppendStream.PageDataSize, out rem); if (rem > 0) { pagesToRead++; } var pagesBuffer = ReadPages(pagesToRead); using (var targetWriter = new BinaryWriter(new MemoryStream(buffer))) using (var pageReader = new BinaryReader(new MemoryStream(pagesBuffer))) { targetWriter.BaseStream.Seek(offset, SeekOrigin.Begin); var rest = count; do { var pageDataSize = pageReader.ReadInt16(); // Must read PageDataLengthType type // Move to current reading position if (_offset != 0) { pageReader.ReadBytes(_offset); } var bytesToRead = (PageDataLengthType)(Math.Min(_offset + rest, pageDataSize) - _offset); rest -= bytesToRead; var bytes = pageReader.ReadBytes(bytesToRead); targetWriter.Write(bytes); _offset += bytesToRead; if (_offset != PageBlobAppendStream.PageDataSize) { continue; } _offset = 0; _pageIndex++; } while (rest > 0); } return(count); }
public void Append(byte[] buffer, int offset, PageDataLengthType count) { if (Length + count > PageDataSize) { throw new ArgumentOutOfRangeException("count"); } using (var bw = new BinaryWriter(new MemoryStream(_data))) { bw.BaseStream.Seek(Length, SeekOrigin.Begin); bw.Write(buffer, offset, count); Length += count; } }