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("不存在");
                }
            }
        }
    }
}
相关推荐
不穿格子的程序员9 分钟前
从零开始刷算法-栈-括号匹配
java·开发语言·
雪域迷影24 分钟前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
yue00826 分钟前
C#类继承
java·开发语言·c#
Want59533 分钟前
Python汤姆猫
开发语言·python
Larry_Yanan1 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
凯芸呢1 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
竹竹零1 小时前
JacksonUtil--序列化与反序列化
java·开发语言·windows
AI柠檬1 小时前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
sheji34162 小时前
【开题答辩全过程】以 基于Java的旅游网站的设计与开发为例,包含答辩的问题和答案
java·开发语言·旅游
code bean2 小时前
【C#】Channel<T>:现代 .NET 中的异步生产者-消费者模型详解
c#