c#_文件的读写 IO

发布于:2025-07-31 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

常用文件 IO 操作的表格总结                表格说明                示例代码

Directory.GetCurrentDirectory()  获取当前程序的运行目录

Directory 获取当前目录

FileStream 文件中任何位置的读写

        写入文件数据 OpenWrite

        读取文件数据 OpenRead

CreateDirectory ()  创建目录 及其子目录

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语句,以确保资源正确释放
  • 实际开发中,应根据文件大小、操作频率和数据类型选择合适的方法

示例代码:

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("文件储存地址");

StreamWriterStreamReader类用于文本文件的数据读写,这些类从抽象基类 Stream 继承。

详细方法可参考:C# 文本文件的读写 StreamReader 和 StreamWriter 类 

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("不存在");
                }
            }
        }
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到