using Masuit.Tools.Systems; using System; 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 PooledMemoryStream SaveAsMemoryStream(this Stream stream) { if (stream is PooledMemoryStream pooledMemoryStream) { return pooledMemoryStream; } stream.Position = 0; var ms = new PooledMemoryStream(); stream.CopyTo(ms); stream.Position = 0; return ms; } /// /// /// /// /// 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 void ShuffleCode(this Stream stream) { if (stream.CanWrite && stream.CanSeek) { var position = stream.Position; stream.Position = stream.Length; for (int i = 0; i < new Random().Next(1, 20); i++) { stream.WriteByte(0); } stream.Flush(); stream.Position = position; } } /// /// 读取所有行 /// /// /// 读取完毕后关闭流 /// public static List ReadAllLines(this StreamReader stream, bool closeAfter = true) { var stringList = new List(); while (stream.ReadLine() is { } str) { 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(); var sr = new StreamReader(stream, encoding); while (sr.ReadLine() is { } str) { 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); stream.SetLength(0); 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); stream.SetLength(0); 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(); while (await stream.ReadLineAsync().ConfigureAwait(false) is { } str) { 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(); var sr = new StreamReader(stream, encoding); while (await sr.ReadLineAsync().ConfigureAwait(false) is { } str) { 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); stream.SetLength(0); 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); stream.SetLength(0); 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 }