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