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
类的静态方法(如WriteAllText
、ReadAllText
)是最简单高效的选择 - 对于大型文件或需要逐行处理的场景,
StreamReader
和StreamWriter
更为适合 - 处理二进制文件(如图像、视频等)时,应使用
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("文件储存地址");
StreamWriter和StreamReader类用于文本文件的数据读写,这些类从抽象基类 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("不存在");}}}}
}