C# Stream的使用之Filestream

流(Stream)是.NET Framework为程序提供的读写数据的方法。每个流都是抽象类Stream的子类,已经内置类很多流类用来完成不同的工作

1,Stream–>FileStream读写文件, FileStream 类只能处理原始字节(raw byte)。FileStream 类可以用于任何数据文件,而不仅仅是文本文件。FileStream 对象可以用于读取诸如图像和声音的文件,FileStream读取出来的是字节数组,然后通过编码转换将字节数组转换成字符串。

引用命名空间

using System.IO;

声明一个FileStream类的对象

FileStream fsRead = new FileStream(string path, FileMode mode, FileAccess access);

参数解析:
path:要操作的文件路径,路径可以是绝对路径或者相对路径。

//Directory.GetCurrentDirectory()保存到解决方案下的默认地址  file.FileName给的文件名
var filefullPath = Path.Combine(Directory.GetCurrentDirectory(), file.FileName);

mode:操作文件的方式,打开或者创建

access:操作文件中的数据,读取或者写入

实操

例子一 postman保存文件到本地


        /// <summary>
        /// postman上传文件到本地
        /// </summary>
        /// <param name="filename">保存文件名称</param>
        /// <param name="file">文件</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<string> SaveFile([FromForm] string filename, IFormFile file)
        {
            return await Task.Run(() =>
            {
                try
                {
                    //保存文件到本地
                    var filefullPath = Path.Combine(Directory.GetCurrentDirectory(), filename);
                    using (FileStream fs = new FileStream(filefullPath, FileMode.Create,FileAccess.ReadWrite))
                    {
                        file.CopyTo(fs);
                        fs.Flush();
                    }
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                return "保存成功";
            });
        }

例子二 读取本地txt文件返回内容到控制器

        /// <summary>
        /// 读取本地文件内容转json
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string ReadByFileStream()
        {
            FileStream fsRead = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件.txt", FileMode.OpenOrCreate, FileAccess.Read);
            string s = "";
            byte[] buffer = new byte[10000];//声明一个字节数组,用来临时存储读取到数据,最大存储255字节
            while (true)
            {
                //每次读取buffer声明的最大的byte字节 最后叠加到string中
                //如果读取的内容比byte字节少 则一次读完直接跳出循环 否则一直循环最大的byte读 知道txt读完 r为0  直到跳出循环位置
                int r = fsRead.Read(buffer, 0, buffer.Length);//返回本次实际读取到的字节数 
                if (r == 0)//如果读取到的字节数为0,说明已到达文件结尾,则退出while循环
                {
                    break;
                }
                s += Encoding.UTF8.GetString(buffer, 0, r);//将字节数组转换成字符串;buffer:要转换的字节数组;0:第一个要解码的字节的索引;r:要解码的字节数 
                Console.WriteLine(s);
            }
            fsRead.Close();  //关闭流
            fsRead.Dispose(); //释放流

            return s;

        }

例子三 控制器写入内容到本地文件


注意:当使用filestream 不用using包裹的话 且未使用close dispose会造成文件被锁

        /// <summary>
        /// 程序写入内容至本地文件
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public void WriteByFileStream()
        {
            using (FileStream fsWrite = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件1.txt", FileMode.Append, FileAccess.Write))
            {
                Console.WriteLine("请输入文本");//提示用户输入字符串
                string str = Console.ReadLine();//接受用户输入的字符串
                byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转换成字节数组
                fsWrite.Write(array, 0, array.Length);//将字节数组写入到文本文件
                Console.WriteLine("写入成功");
                //不需要关闭流 或者释放流 因为使用了using filestream继承了stream的close()
                //fsWrite.Close();  //关闭流
                //fsWrite.Dispose(); //释放流
            }

            //不推荐
            //当不使用using时 也不关闭流 和释放流的 时候 查看文件时 会显示进程被占用 并无法正确的写入(错误)
            //FileStream fsWrite = new FileStream(@"D:\我的收藏\host前期建设详细程序\HostWebDetail\WebAPI\文件1.txt", FileMode.Append, FileAccess.Write);
            //Console.WriteLine("请输入文本");//提示用户输入字符串
            //string str = Console.ReadLine();//接受用户输入的字符串
            //byte[] array = Encoding.UTF8.GetBytes(str);//将字符串转换成字节数组
            //fsWrite.Write(array, 0, array.Length);//将字节数组写入到文本文件
            //Console.WriteLine("写入成功");
        }
    }

2, Stream–>MemoryStream读写内存块数据

Stream–>NetworkStream读写其他计算机或设备数据
Stream–>GZipStream压缩数据便于下载和存储

posted @   原往  阅读(2414)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示