c#_文件的读写 IO

目录

[常用文件 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类的静态方法(如WriteAllTextReadAllText)是最简单高效的选择
  • 对于大型文件或需要逐行处理的场景,StreamReaderStreamWriter更为适合
  • 处理二进制文件(如图像、视频等)时,应使用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("文件储存地址");

StreamWriterStreamReader类用于文本文件的数据读写,这些类从抽象基类 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("不存在");
                }
            }
        }
    }
}
相关推荐
雨中散步撒哈拉7 小时前
17、做中学 | 初三下期 Golang文件操作
开发语言·后端·golang
CoderYanger7 小时前
C.滑动窗口——1423. 可获得的最大点数
java·开发语言·算法·leetcode·1024程序员节
全栈陈序员7 小时前
【Python】基础语法入门(九)—— 代码规范、调试技巧与性能初探
开发语言·python·代码规范
合作小小程序员小小店7 小时前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
Yue丶越7 小时前
【C语言】数据在内存中的存储
c语言·开发语言·网络
FakeOccupational8 小时前
电路笔记(信号):网线能传多少米?网线信号传输距离
开发语言·笔记·php
李宥小哥8 小时前
Redis10-原理-网络模型
开发语言·网络·php
利刃大大8 小时前
【c++中间件】语音识别SDK && 二次封装
开发语言·c++·中间件·语音识别
同学小张13 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
踢球的打工仔14 小时前
PHP面向对象(7)
android·开发语言·php