using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace System.IO { /// /// Provides extension methods for the . /// public static class StreamExtensions { /// /// Reads a line from a . /// /// The stream to read from. /// The encoding to use. /// The character determinating a line end. /// public static string ReadLine(this Stream stream, Encoding encoding = null, char? eol = null) { if (encoding == null) encoding = Encoding.Default; if (eol == null) eol = Environment.NewLine.Last(); if (!stream.CanRead) return null; var bytes = new List(); char ch; do { int result = stream.ReadByte(); if (result == -1) break; byte b = (byte)result; bytes.Add(b); ch = (char)result; } while (ch != eol); return encoding.GetString(bytes.ToArray()).Trim(); } /// /// Reads a line from a asynchronous. /// /// The stream to read from. /// The encoding to use. /// The character determinating a line end. /// The token to monitor for cancellation requests. The default value is . /// public static async Task ReadLineAsync(this Stream stream, Encoding encoding = null, char? eol = null, CancellationToken cancellationToken = default) { if (encoding == null) encoding = Encoding.Default; if (eol == null) eol = Environment.NewLine.Last(); if (!stream.CanRead) return null; var bytes = new List(); char ch; do { byte[] buffer = new byte[1]; int count = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); if (count == 0) break; bytes.Add(buffer[0]); ch = (char)buffer[0]; } while (ch != eol); return encoding.GetString(bytes.ToArray()).Trim(); } } }