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); }
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); }
public override void Flush() { CurrentSubStream.Flush(); }