irc-netcore-api/IRaCIS.Core.Infrastructure/Extention/FileExt.cs

63 lines
2.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.IO;
using System.Threading.Tasks;
namespace IRaCIS.Core.Infrastructure.Extention
{
/// <summary>
/// 大文件操作扩展类
/// </summary>
public static class FileExt
{
/// <summary>
/// 以文件流的形式复制大文件
/// </summary>
/// <param name="fs">源</param>
/// <param name="dest">目标地址</param>
/// <param name="bufferSize">缓冲区大小默认8MB</param>
public static void CopyToFile(this Stream fs, string dest, int bufferSize = 1024 * 8 * 1024)
{
using var fsWrite = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buf = new byte[bufferSize];
int len;
while ((len = fs.Read(buf, 0, buf.Length)) != 0)
{
fsWrite.Write(buf, 0, len);
}
}
/// <summary>
/// 以文件流的形式复制大文件(异步方式)
/// </summary>
/// <param name="fs">源</param>
/// <param name="dest">目标地址</param>
/// <param name="bufferSize">缓冲区大小默认8MB</param>
public static async void CopyToFileAsync(this Stream fs, string dest, int bufferSize = 1024 * 1024 * 8)
{
using var fsWrite = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.ReadWrite);
byte[] buf = new byte[bufferSize];
int len;
await Task.Run(() =>
{
while ((len = fs.Read(buf, 0, buf.Length)) != 0)
{
fsWrite.Write(buf, 0, len);
}
}).ConfigureAwait(true);
}
/// <summary>
/// 将内存流转储成文件
/// </summary>
/// <param name="ms"></param>
/// <param name="filename"></param>
public static void SaveFile(this MemoryStream ms, string filename)
{
using var fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
byte[] buffer = ms.ToArray(); // 转化为byte格式存储
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
}
}