当前位置: 首页 > news >正文

c#_文件的读写 IO

目录

常用文件 IO 操作的表格总结                        表格说明

示例代码

Directory.GetCurrentDirectory()  获取当前程序的运行目录

Directory 获取当前目录

FileStream 文件中任何位置的读写

        写入文件数据 OpenWrite

        读取文件数据 OpenRead

CreateDirectory ()  创建目录 及其子目录

StreamWriter和StreamReader类用于文本文件的数据读写


在 C# 中,文件读写是非常常见的操作,.NET 框架提供了多种方式来处理文件 IO 操作。

常用文件 IO 操作的表格总结:

操作类型方法 / 类适用场景优点缺点
文本文件写入File.WriteAllText()小型文本文件一次性写入代码简洁,无需手动处理流不适合大文件,会一次性加载到内存
文本文件读取File.ReadAllText()小型文本文件一次性读取操作简单,一行代码完成大文件会占用大量内存
按行写入File.WriteAllLines()需按行组织的文本文件直接处理字符串数组不适合增量写入
按行读取File.ReadAllLines()需按行处理的文本文件直接返回字符串数组大文件内存占用高
流式写入StreamWriter大型文件、增量写入内存占用低,可逐步写入代码相对复杂
流式读取StreamReader大型文件、逐行处理内存占用低,可按需读取需要手动处理读取循环
二进制写入FileStream + Write()非文本文件(图片、音频等)处理任意二进制数据需手动管理字节数组
二进制读取FileStream + Read()读取二进制文件能处理各种格式的二进制数据需要处理字节级操作
追加内容File.AppendAllText()向文件末尾添加内容无需打开整个文件不适合频繁追加操作
追加内容StreamWriter(Append 模式)频繁追加的场景可保持连接多次写入需要手动管理流的生命周期

表格说明:

  • 对于小型文本文件,File类的静态方法(如WriteAllTextReadAllText)是最简单高效的选择
  • 对于大型文件或需要逐行处理的场景,StreamReaderStreamWriter更为适合
  • 处理二进制文件(如图像、视频等)时,应使用FileStream
  • 所有涉及流的操作都建议使用using语句,以确保资源正确释放
  • 实际开发中,应根据文件大小、操作频率和数据类型选择合适的方法

示例代码:

static void Main(){// 1. 简单文本写入string text = "Hello, File IO!";File.WriteAllText("test.txt", text);Console.WriteLine("文本写入完成");// 2. 简单文本读取string readText = File.ReadAllText("test.txt");Console.WriteLine("读取内容: " + readText);// 3. 按行写入string[] lines = { "第一行", "第二行", "第三行" };File.WriteAllLines("lines.txt", lines);// 4. 按行读取string[] readLines = File.ReadAllLines("lines.txt");Console.WriteLine("按行读取:");foreach (var line in readLines)Console.WriteLine(line);// 5. 追加内容File.AppendAllText("test.txt", "\n这是追加的内容");// 6. 大文件读取(流式)using (var reader = new StreamReader("large_file.txt")){string line;while ((line = reader.ReadLine()) != null){// 处理每行内容Console.WriteLine("读取行: " + line);}}// 7. 大文件写入(流式)using (var writer = new StreamWriter("large_output.txt")){for (int i = 0; i < 1000; i++){writer.WriteLine($"这是第 {i} 行数据");}}// 8. 二进制文件操作byte[] data = { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello"的ASCII码File.WriteAllBytes("binary.dat", data);byte[] readData = File.ReadAllBytes("binary.dat");Console.WriteLine("二进制数据: " + BitConverter.ToString(readData));}

Directory.GetCurrentDirectory()  获取当前程序的运行目录

string path= Directory.GetCurrentDirectory()+ "\\写文件.txt";
FileInfo fi = new FileInfo(path);

或者直接输入路径 对文件执行操作  提供路径  这种路径写法 绝对路径 缺点路径固定 程序发给别人路径不一样程序就不能跑

FileInfo fi = new FileInfo("C:\\Users\\17802\\Desktop\\AISee\\7.30 拆箱装箱 Equals与== 文件读取IO xml文件 事件Event\\3、文件\\写文件.txt");
 Directory 获取当前目录
//Directory 获取当前目录
Console.WriteLine(fi.Directory);//创建文件  当路径不存在时 会创建一个
fi.Directory.Create();

FileStream 文件中任何位置的读写

写入文件数据 OpenWrite
// 1. 打开文件  确定文件流 是写入数据还是读数据  写数据
FileStream stream = fi.OpenWrite();
// 2. 写数据
byte[] bytes = { 1, 2, 3, 4, 5, 6, 7, 8 };
// Write 写入数据 bytes 要写书的数据  写多少? 0 从0开始  写进去bytes.Length 个
stream.Write(bytes, 0, bytes.Length);
// 3. 关闭文件流 释放掉与之关联的所有资源
stream.Close();
Console.WriteLine("写入成功");
读取文件数据 OpenRead
// 读取数据
// 1. 打开文件流 确定是读还是写  读数据
FileStream streamRead = fi.OpenRead();// 2. 将读到的数据放到暂存区 不确定能读取到几个 可以是用FileInfo中的Length属性 获取读取文件中的数据长度
byte[] bytes1 = new byte[fi.Length];
//Read 读数据 并返回读到的数据个数
int a =  streamRead.Read(bytes1, 0, bytes1.Length);
Console.WriteLine(a);
foreach (var item in bytes1)
{Console.WriteLine(item);
}
// 关闭流
streamRead.Close();
CreateDirectory ()  创建目录 及其子目录
Directory.CreateDirectory("文件储存地址");

StreamWriterStreamReader类用于文本文件的数据读写,这些类从抽象基类 Stream 继承。

详细方法可参考:C# 文本文件的读写 StreamReader 和 StreamWriter 类 

internal class Program
{static void Main(string[] args){//写数据  StreamWriter//保存数据的路径string path = Directory.GetCurrentDirectory() + "\\Date\\数据.txt";//使用流写数据 StreamWriterWrite(path);//使用流读数据  StreamReaderRead(path);}public static void Write(string path){//创建一个 StreamWriter 对象来进行数据的编写与保存//参数: 路径  覆盖false还是追加 true数据  编码格式List<string> list = new List<string>() { "张三","李四","王五","小明","小红"};//从字节流中写入字符using (StreamWriter sw = new StreamWriter(path, false ,Encoding.UTF8 )){// 写入数据 数据不换行sw.Write("张三今天打游戏了");sw.Write("李四今天游泳了");//写入数据 数据会换行sw.WriteLine("王五进行吃饭了");sw.WriteLine(123456);sw.WriteLine("测试测试测试");Console.WriteLine("写入成功");sw.WriteLine(list);}}public static void Read(string path){//创建一个 StreamReader 对象来进行数据的读取//从字节流中读取字符using (StreamReader sr = new StreamReader(path)){string str  =  sr.ReadToEnd();string[] strarr = str.Split('\n');for (int i = 0; i < strarr.Length; i++){if (strarr[i].Contains("张三")){Console.WriteLine("存在");}else{Console.WriteLine("不存在");}}}}
}
http://www.dtcms.com/a/307014.html

相关文章:

  • 关系型数据库架构最优选择:基于落霞归雁思维框架的分析
  • 7月30日作业
  • Spring Boot 数据源配置中为什么可以不用写 driver-class-name
  • 第六章第一节 TIM 定时中断
  • vue2中的过滤器filter
  • 1+1>2!特征融合如何让目标检测更懂 “场景”?
  • 深入理解数据库事务:从概念到实践
  • 防止飞书重复回调通知分布式锁
  • 白话容器基础(一):进程
  • Mybatis分页查询当前页数据条数大于实际返回的数据条数
  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • Matplotlib(四)- 图表样式美化
  • Linux日志管理和时钟同步配置指南
  • OneCode3.0 框架深入研究与应用扩展
  • html页面跳转或者a标签锚点跳转,解决页面滚动问题3个(1.从底部开始滚动,2.滚动不到指定锚点位置,3.页面展示不在最上面)
  • MySQL图解索引篇(2)
  • 斯皮尔曼spearman相关系数
  • 25年新算法!基于猛禽的优化算法(BPBO):一种元启发式优化算法,附完整免费MATLAB代码
  • Java反射-动态代理
  • cmake_parse_arguments()构建清晰灵活的 CMake 函数接口
  • 智汇AI,应用领航 | 华宇万象问数入选2025全景赋能典型案例
  • 36、spark-measure 源码修改用于数据质量监控
  • Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)
  • 「Spring Boot + MyBatis-Plus + MySQL 一主两从」读写分离实战教程
  • Linux 中,命令查看系统版本和内核信息
  • Linux 系统原理深度剖析与技术实践:从内核架构到前沿应用
  • 【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)(单片机选型主要考虑的参数与因素)
  • 【python】列表“*”方式与推导式方式初始化区别
  • 数据结构——单链表1
  • 【WRF-Chem】EDGAR 排放数据处理:分部门合并转化为二进制(Python全代码)