目录
[常用文件 IO 操作的表格总结](#常用文件 IO 操作的表格总结)表格说明示例代码
[Directory.GetCurrentDirectory() 获取当前程序的运行目录](#Directory.GetCurrentDirectory() 获取当前程序的运行目录)
[Directory 获取当前目录](#Directory 获取当前目录)
[FileStream 文件中任何位置的读写](#FileStream 文件中任何位置的读写)
[写入文件数据 OpenWrite](#写入文件数据 OpenWrite)
[读取文件数据 OpenRead](#读取文件数据 OpenRead)
[CreateDirectory () 创建目录 及其子目录](#CreateDirectory () 创建目录 及其子目录)
[StreamWriter和StreamReader类用于文本文件的数据读写,这些类从抽象基类 Stream 继承。](#StreamWriter和StreamReader类用于文本文件的数据读写,这些类从抽象基类 Stream 继承。)
在 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
语句,以确保资源正确释放 - 实际开发中,应根据文件大小、操作频率和数据类型选择合适的方法
示例代码:
cs
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() 获取当前程序的运行目录
cs
string path= Directory.GetCurrentDirectory()+ "\\写文件.txt";
FileInfo fi = new FileInfo(path);
或者直接输入路径 对文件执行操作 提供路径 这种路径写法 绝对路径 缺点路径固定 程序发给别人路径不一样程序就不能跑
cs
FileInfo fi = new FileInfo("C:\\Users\\17802\\Desktop\\AISee\\7.30 拆箱装箱 Equals与== 文件读取IO xml文件 事件Event\\3、文件\\写文件.txt");
Directory 获取当前目录
cs
//Directory 获取当前目录
Console.WriteLine(fi.Directory);
//创建文件 当路径不存在时 会创建一个
fi.Directory.Create();
FileStream 文件中任何位置的读写
写入文件数据 OpenWrite
cs
// 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
cs
// 读取数据
// 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 () 创建目录 及其子目录
cs
Directory.CreateDirectory("文件储存地址");
StreamWriter和StreamReader类用于文本文件的数据读写,这些类从抽象基类 Stream 继承。
详细方法可参考:C# 文本文件的读写 StreamReader 和 StreamWriter 类
cs
internal class Program
{
static void Main(string[] args)
{
//写数据 StreamWriter
//保存数据的路径
string path = Directory.GetCurrentDirectory() + "\\Date\\数据.txt";
//使用流写数据 StreamWriter
Write(path);
//使用流读数据 StreamReader
Read(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("不存在");
}
}
}
}
}