Exemplo n.º 1
0
        public override long Seek(long offset, SeekOrigin origin)
        {
            if (!CanSeek)
            {
                throw new NotSupportedException();
            }

            Console.WriteLine("seeking from origin " + origin + " to offset " + offset);

            long newPos = 0;

            switch (origin)
            {
            case SeekOrigin.Begin:
                newPos = offset;
                break;

            case SeekOrigin.Current:
                newPos = Position + offset;
                break;

            case SeekOrigin.End:
                newPos = Length + offset;
                break;
            }

            long streamLengthSum = 0;
            int  streamIndex     = 0;

            while (streamLengthSum + subStreams[streamIndex].Length < newPos)
            {
                streamLengthSum += subStreams[streamIndex].Length;
                streamIndex++;
            }

            if (CurrentSubStreamIndex != streamIndex)
            {
                CurrentSubStreamIndex = streamIndex;
            }
            CurrentSubStream.Seek(newPos - streamLengthSum, SeekOrigin.Begin);

            return(Position);
        }
Exemplo n.º 2
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            int bytesRead = CurrentSubStream.Read(buffer, offset, count);

            if (bytesRead == 0 && count > 0)
            {
                // we reached the EOF
                Console.WriteLine("end of substream " + currentSubStreamIndex + " reached");

                if (LastSubStream)
                {
                    // we reached not only EOF, but EOF of the last stream (so we're at the very end)
                    Console.WriteLine("end of stream reached");
                    return(bytesRead);
                }

                // switch to and continue with next file stream
                CurrentSubStreamIndex++;

                return(Read(buffer, offset, count));
            }

            return(bytesRead);
        }
Exemplo n.º 3
0
 public override void Flush()
 {
     CurrentSubStream.Flush();
 }