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("不存在");
                }
            }
        }
    }
}
相关推荐
项目申报小狂人6 分钟前
2025年1中科院1区顶刊SCI-投影迭代优化算法Projection Iterative Methods-附完整Matlab免费代码
开发语言·算法·matlab
weixin_4374999239 分钟前
【PHP属性详解:从基础到只读的完全指南】
开发语言·php
枫叶落雨22240 分钟前
Hutool 的 WordTree(敏感词检测)
java·开发语言
Layflok1 小时前
《黑马笔记》 --- C++ 提高编程
开发语言·c++·stl
上单带刀不带妹1 小时前
ES6中import与export的用法详解
开发语言·javascript·es6·import·export
80岁小姑娘1 小时前
.NET Core部署服务器
c#
bubiyoushang8881 小时前
基于C#的CAN通讯接口程序
stm32·单片机·c#
工程师0071 小时前
C#接口的定义与使用
开发语言·c#·接口
sali-tec1 小时前
C# 基于halcon的视觉工作流-章27-带色中线
开发语言·人工智能·算法·计算机视觉·c#
加号31 小时前
【C#】基于SharpCompress实现压缩包解压功能
c#