using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; #if NET5_0_OR_GREATER using System; using System.Buffers; using System.Runtime.InteropServices; #endif namespace Masuit.Tools { public static class StreamExtensions { /// /// 将流转换为内存流 /// /// /// public static MemoryStream SaveAsMemoryStream(this Stream stream) { stream.Position = 0; return new MemoryStream(stream.ToArray()); } /// /// /// /// /// public static byte[] ToArray(this Stream stream) { stream.Position = 0; byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } /// /// 读取所有行 /// /// /// 读取完毕后关闭流 /// public static List ReadAllLines(this StreamReader stream, bool closeAfter = true) { var stringList = new List(); string str; while ((str = stream.ReadLine()) != null) { stringList.Add(str); } if (closeAfter) { stream.Close(); stream.Dispose(); } return stringList; } /// /// 读取所有行 /// /// /// /// 读取完毕后关闭流 /// public static List ReadAllLines(this FileStream stream, Encoding encoding, bool closeAfter = true) { var stringList = new List(); string str; var sr = new StreamReader(stream, encoding); while ((str = sr.ReadLine()) != null) { stringList.Add(str); } if (closeAfter) { sr.Close(); sr.Dispose(); stream.Close(); stream.Dispose(); } return stringList; } /// /// 读取所有文本 /// /// /// /// 读取完毕后关闭流 /// public static string ReadAllText(this FileStream stream, Encoding encoding, bool closeAfter = true) { var sr = new StreamReader(stream, encoding); var text = sr.ReadToEnd(); if (closeAfter) { sr.Close(); sr.Dispose(); stream.Close(); stream.Dispose(); } return text; } /// /// 写入所有文本 /// /// /// /// /// 读取完毕后关闭流 /// public static void WriteAllText(this FileStream stream, string content, Encoding encoding, bool closeAfter = true) { var sw = new StreamWriter(stream, encoding); sw.Write(content); if (closeAfter) { sw.Close(); sw.Dispose(); stream.Close(); stream.Dispose(); } } /// /// 写入所有文本行 /// /// /// /// /// 读取完毕后关闭流 /// public static void WriteAllLines(this FileStream stream, IEnumerable lines, Encoding encoding, bool closeAfter = true) { var sw = new StreamWriter(stream, encoding); foreach (var line in lines) { sw.WriteLine(line); } sw.Flush(); if (closeAfter) { sw.Close(); sw.Dispose(); stream.Close(); stream.Dispose(); } } /// /// 共享读写打开文件 /// /// /// public static FileStream ShareReadWrite(this FileInfo file) { return file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); } /// /// 读取所有行 /// /// /// 读取完毕后关闭流 /// public static async Task> ReadAllLinesAsync(this StreamReader stream, bool closeAfter = true) { var stringList = new List(); string str; while ((str = await stream.ReadLineAsync().ConfigureAwait(false)) != null) { stringList.Add(str); } if (closeAfter) { stream.Close(); stream.Dispose(); } return stringList; } /// /// 读取所有行 /// /// /// /// 读取完毕后关闭流 /// public static async Task> ReadAllLinesAsync(this FileStream stream, Encoding encoding, bool closeAfter = true) { var stringList = new List(); string str; var sr = new StreamReader(stream, encoding); while ((str = await sr.ReadLineAsync().ConfigureAwait(false)) != null) { stringList.Add(str); } if (closeAfter) { sr.Close(); sr.Dispose(); stream.Close(); #if NET5_0_OR_GREATER await stream.DisposeAsync().ConfigureAwait(false); #else stream.Dispose(); #endif } return stringList; } /// /// 读取所有文本 /// /// /// /// 读取完毕后关闭流 /// public static async Task ReadAllTextAsync(this FileStream stream, Encoding encoding, bool closeAfter = true) { var sr = new StreamReader(stream, encoding); var text = await sr.ReadToEndAsync().ConfigureAwait(false); if (closeAfter) { sr.Close(); sr.Dispose(); stream.Close(); #if NET5_0_OR_GREATER await stream.DisposeAsync().ConfigureAwait(false); #else stream.Dispose(); #endif } return text; } /// /// 写入所有文本 /// /// /// /// /// 读取完毕后关闭流 /// public static async Task WriteAllTextAsync(this FileStream stream, string content, Encoding encoding, bool closeAfter = true) { var sw = new StreamWriter(stream, encoding); await sw.WriteAsync(content).ConfigureAwait(false); await sw.FlushAsync().ConfigureAwait(false); if (closeAfter) { sw.Close(); stream.Close(); #if NET5_0_OR_GREATER await sw.DisposeAsync().ConfigureAwait(false); await stream.DisposeAsync().ConfigureAwait(false); #else sw.Dispose(); stream.Dispose(); #endif } } /// /// 写入所有文本行 /// /// /// /// /// 读取完毕后关闭流 /// public static async Task WriteAllLinesAsync(this FileStream stream, IEnumerable lines, Encoding encoding, bool closeAfter = true) { var sw = new StreamWriter(stream, encoding); foreach (var line in lines) { await sw.WriteLineAsync(line).ConfigureAwait(false); } await sw.FlushAsync().ConfigureAwait(false); if (closeAfter) { sw.Close(); stream.Close(); #if NET5_0_OR_GREATER await sw.DisposeAsync().ConfigureAwait(false); await stream.DisposeAsync().ConfigureAwait(false); #else sw.Dispose(); stream.Dispose(); #endif } } #if NET5_0_OR_GREATER /// /// /// /// /// /// public static async Task ToArrayAsync(this Stream stream, CancellationToken cancellationToken = default) { stream.Position = 0; byte[] bytes = new byte[stream.Length]; await stream.ReadAsync(bytes, cancellationToken); stream.Seek(0, SeekOrigin.Begin); return bytes; } #endif } }