C# FileStream转byte数组,轻松搞定大文件转换

文件流()转换技术是软件开发的基础能力,合理运用可以高效解决各种文件处理需求,特别是在处理大文件或需要低内存占用的场景中表现尤为突出。
文件流是处理文件数据的核心机制,在实际运用中,可以将多种格式例如文本,图片,音频、视频、压缩包文件等不同格式文件转换为文件流;
文件流可运用于Web系统中的文件上传、下载,及云存储服务的文件传输,文件加密/解密,数字签名验证,跨平台文件交换,移动端与服务器文件同步,不同系统间文件格式转换,二进制协议通信等;
本文介绍内容如下:
1、文件转换为数据流:
(1)将文件转为byte字节数据流;
(2)将文件转为数据流;
(3)将文件转为数据流;
2、文件数据流互换:
(1)文件数据流转换为byte字节二进制数据流;
3、图片数据流处理:
(1)将图片转换数据流;
(2)将图片转换为Image对像;
(3)将图片的byte字节流转换为Image对像;
4、将二进制数据流写入文件:
(1)将byte字节数据流写入文件;
(2)将数据流写入文件;
(3)将数据流写入文件;
注:对于大容量文件,用于远程网络传输时,可以采用分段传输,在传输线程中合理的设置好缓存大小分段传输,有兴趣的同学可以尝试远程文件传输;
以下为详细调用函数:
一、将文件转换为二进制文件流:
1、将文件转为byte字节数据流
/// <summary>/// 将文件转为byte字节二进制数据流/// </summary>/// <param name="filePath">文件的绝对路径</param>public byte[] ReadFileBytes(string filePath){byte[] buffer;try{//将文件转换为流using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)) //FileShare.Read防占用打开读取{//创建一个临时缓冲区buffer = new byte[fs.Length];//将文件流读入缓冲区fs.Read(buffer, 0, buffer.Length);//关闭文件流fs.Close();// 把 byte[] 转换成 Stream//Stream stream = new MemoryStream(buffer);//string ss = Encoding.Default.GetString(buffer, 0, fileSize);文件流转换为字符串}}catch{return null;}return buffer;}
2、将文件转为数据流
/// </summary>/// 将文件转为Stream数据流/// </summary>/// <param name="filePath"></param>/// <returns></returns>public Stream ReadFileStream(string filePath){Stream stream;try{//将文件转换为流using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read)){//创建一个临时缓冲区byte[] buffer = new byte[fs.Length];//将文件流读入缓冲区fs.Read(buffer, 0, buffer.Length);//关闭文件流fs.Close();// 把 byte[] 转换成 Streamstream = new MemoryStream(buffer);}}catch{return null;}return stream;}
3、将文件转为数据流
/// <summary>/// 将文件转为MemoryStream数据流/// </summary>/// <param name="FilePath"></param>/// <returns></returns>public MemoryStream ReadFileMemorySteam(string FilePath){try{///定义并实例化一个内存流,以存放图片的字节数组。using (MemoryStream RetMemoryFile = new MemoryStream()){///读入FileStreamusing (FileStream fi = new FileStream(FilePath, FileMode.Open)){///把FileStream写入MemoryStreamRetMemoryFile.SetLength(fi.Length);fi.Read(RetMemoryFile.GetBuffer(), 0, (int)fi.Length);RetMemoryFile.Flush();fi.Close();}return RetMemoryFile;}}catch (Exception){return null;}}
二、文件数据流互换:
1、文件数据流转换为byte字节二进制数据流
/// <summary>/// 文件Stream数据流转换为byte字节二进制数据流/// </summary>/// <param name="stream">原始流</param>public byte[] FileStreamToBytes(Stream stream){try{//创建缓冲区byte[] buffer = new byte[stream.Length];//读取流stream.Read(buffer, 0, int.Parse(stream.Length.ToString()));//返回流return buffer;}catch{return null;}finally{//关闭流stream.Close();}}
三、图片数据流处理:
1、将图片转换数据流
/// <summary>/// 将Bitmap图片转换Stream数据流/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public Stream BitmapStream(Bitmap bitmap){ try { MemoryStream stream = new MemoryStream(); bitmap.Save(stream, ImageFormat.Jpeg); stream.Seek(0, SeekOrigin.Begin); return stream; } catch (Exception) { return null; }} 2、将图片的byte字节流转换为Image对像
/// <summary>/// 将图片的byte字节流转换为Image对像/// </summary>/// <param name="bytes"></param>/// <returns></returns>public Image ByteToImage(byte[] bytes){ try { Image RetImg = null; if (bytes == null) return null; using (MemoryStream stream = new MemoryStream(bytes)) { RetImg = Image.FromStream(stream); stream.Flush(); } return RetImg; } catch (Exception) { return null; }}3、将图片转换为Image对像
/// <summary>/// 将Bitmap图片转换为Image对像/// </summary>/// <param name="bitmap"></param>/// <returns></returns>public Image BitmapToImage(Bitmap bitmap){try{//Bitmap 转换为 StreamMemoryStream stream = new MemoryStream();bitmap.Save(stream, ImageFormat.Jpeg);stream.Seek(0, SeekOrigin.Begin);//Stream 转换为 byte[]byte[] buffer = FileStreamToBytes(stream);Image RetImg = ByteToImage(buffer);return RetImg;}catch (Exception){return null;}}
四、将二进制数据流写入文件
1、将byte字节数据流写入文件
/// <summary>/// 将byte字节数据流写入文件/// </summary>/// <param name="filePath">文件的绝对路径</param>/// <param name="buffer">二进制流数据</param>public bool WriteFileBytes(string filePath, byte[] buffer){try{//如果文件不存在则创建该文件if (File.Exists(filePath)) File.Delete(filePath);//判断文件是否可读FileInfo file = new FileInfo(filePath);if (!file.IsReadOnly) return false;//创建文件using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)){fs.Seek(0, SeekOrigin.End);//写入二进制流fs.Write(buffer, 0, buffer.Length);//关闭文件流fs.Close();}}catch{return false;}return true;}
2、将数据流写入文件
/// <summary>/// 将Stream数据流写入文件/// </summary>/// <param name="filePath">文件的绝对路径</param>/// <param name="stream">文件内容流</param>/// <returns></returns>public bool WriteFileStream(string filePath, Stream stream){try{if (File.Exists(filePath)) File.Delete(filePath);// 把 Stream 转换成 byte[]byte[] bytes = new byte[stream.Length];stream.Read(bytes, 0, bytes.Length);// 设置当前流的位置为流的开始stream.Seek(0, SeekOrigin.Begin);// 把 byte[] 写入文件using (FileStream fs = new FileStream(filePath, FileMode.Create)){using (BinaryWriter bw = new BinaryWriter(fs)){bw.Write(bytes);bw.Close();}fs.Close();}}catch{return false;}return true;}
3、将数据流写入文件
/// <summary>/// MemoryStream 二进制内存流写入文件/// </summary>/// <param name="FilePath">文件的绝对路径</param>/// <param name="m">文件内容流</param>public void WriteMemoryStream(string FilePath, MemoryStream m){try{using (FileStream fs = new FileStream(FilePath, FileMode.Create)){using (BinaryWriter w = new BinaryWriter(fs)){w.Write(m.ToArray());fs.Close();m.Close();}}}catch (Exception){}}
























