using System.IO; using System.Text; namespace System.Extensions { public static class StreamExtensions { public static void DoWhileReading(this Stream stream, Action action, int bufferLength = 256) { if (stream is null) throw new ArgumentNullException(nameof(stream)); if (action is null) throw new ArgumentNullException(nameof(action)); var buffer = new byte[bufferLength]; var read = stream.Read(buffer, 0, bufferLength); while(read > 0) { action(bufferLength, buffer); read = stream.Read(buffer, 0, bufferLength); } } public static byte[] ReadBytes(this Stream stream, int count) { if (stream is null) throw new ArgumentNullException(nameof(stream)); var buffer = new byte[count]; stream.Read(buffer, 0, count); return buffer; } public static Stream Rewind(this Stream stream) { if (stream is null) throw new ArgumentNullException(nameof(stream)); if (!stream.CanSeek) throw new InvalidOperationException("Stream doesn't support rewinding"); stream.Seek(0, SeekOrigin.Begin); return stream; } public static string ReadUntil(this StreamReader sr, string delim) { var sb = new StringBuilder(); bool found = false; while (!found && !sr.EndOfStream) { for (int i = 0; i < delim.Length; i++) { char c = (char)sr.Read(); sb.Append(c); if (c != delim[i]) break; if (i == delim.Length - 1) { sb.Remove(sb.Length - delim.Length, delim.Length); found = true; } } } return sb.ToString(); } } }