CSharpUtils.Streams.StreamChunker.CopyUpToSequence C# (CSharp) Метод

CopyUpToSequence() публичный Метод

public CopyUpToSequence ( Stream OutputStream, byte Sequence, long MaxReaded = long.MaxValue ) : long
OutputStream Stream
Sequence byte
MaxReaded long
Результат long
		public long CopyUpToSequence(Stream OutputStream, byte[] Sequence, long MaxReaded = long.MaxValue)
		{
			int TempBufferReaded;
			byte[] ConsumedBytes;
			long TotalCopied = 0;

			Action<int> Consume = delegate(int Length)
			{
				if (Length > 0)
				{
					ConsumedBytes = this.Buffer.Consume(Length);
					if (OutputStream != null)
					{
						OutputStream.Write(ConsumedBytes, 0, ConsumedBytes.Length);
					}
					TotalCopied += ConsumedBytes.Length;
				}
			};

			while (true)
			{
				TempBufferReaded = InputStream.Read(TempBuffer, 0, (int)Math.Min(TempBuffer.Length, MaxReaded - TotalCopied));
				if (TempBufferReaded > 0)
				{
					this.Buffer.Produce(TempBuffer, 0, TempBufferReaded);
				}

				if (this.Buffer.ConsumeRemaining <= Sequence.Length) break;

				int FoundIndex = this.Buffer.IndexOf(Sequence);

				// Not Found
				if (FoundIndex == -1)
				{
					Consume(this.Buffer.ConsumeRemaining - Sequence.Length);
				}
				// Found!
				else
				{
					Consume(FoundIndex);
					// Remove Sequence.
					this.Buffer.Consume(Sequence.Length);

					return TotalCopied;
				}
			}

			Consume(this.Buffer.ConsumeRemaining);

			return TotalCopied;
		}
	}

Usage Example

Пример #1
0
        public void TestMethod1()
        {
            var InputStream = new MemoryStream(Encoding.UTF8.GetBytes("A-//-BCD::E"));
            MemoryStream TempStream;

            StreamChunker test = new StreamChunker(InputStream);

            TempStream = new MemoryStream();
            test.CopyUpToSequence(TempStream, Encoding.UTF8.GetBytes("-//-"));
            Assert.AreEqual("A", Encoding.UTF8.GetString(TempStream.ToArray()));

            TempStream = new MemoryStream();
            test.CopyUpToSequence(TempStream, Encoding.UTF8.GetBytes("::"));
            Assert.AreEqual("BCD", Encoding.UTF8.GetString(TempStream.ToArray()));

            TempStream = new MemoryStream();
            test.CopyUpToSequence(TempStream, Encoding.UTF8.GetBytes("**"));
            Assert.AreEqual("E", Encoding.UTF8.GetString(TempStream.ToArray()));
        }