详解C#的文件写入和读取:从基础到高级应用

news/2025/1/16 1:38:46 标签: c#, .net

详解C#的文件写入和读取:从基础到高级应用

文件操作是C#编程中不可或缺的一部分,无论是写入日志、读取配置文件,还是处理用户数据,文件读写都是开发中的常见任务。本文将全面解析C#中的文件写入和读取操作,涵盖从基础的File类到高级的FileStreamStreamReader/StreamWriter,帮助你掌握文件操作的核心技能。


1. 文件写入的基础操作

1.1 使用 File.WriteAllText

File.WriteAllText 是C#中最简单的文件写入方法,它可以将字符串直接写入文件。如果文件不存在,它会自动创建文件;如果文件已存在,它会覆盖原有内容。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        string content = "Hello, this is a sample text!";

        // 写入文件
        File.WriteAllText(filePath, content);

        Console.WriteLine("文件写入成功!");
    }
}

特点

  • 简单易用,适合写入少量文本。
  • 会覆盖文件原有内容。

1.2 使用 File.WriteAllLines

File.WriteAllLines 可以将字符串数组逐行写入文件。每一行对应数组中的一个元素。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        string[] lines = { "Line 1", "Line 2", "Line 3" };

        // 写入文件
        File.WriteAllLines(filePath, lines);

        Console.WriteLine("文件写入成功!");
    }
}

特点

  • 适合写入多行文本。
  • 会覆盖文件原有内容。

1.3 使用 File.AppendAllText

File.AppendAllText 用于在文件末尾追加内容,而不会覆盖原有内容。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        string content = "This text is appended!";

        // 追加内容
        File.AppendAllText(filePath, content);

        Console.WriteLine("内容追加成功!");
    }
}

特点

  • 适合在文件末尾追加内容。
  • 不会覆盖文件原有内容。

2. 文件读取的基础操作

2.1 使用 File.ReadAllText

File.ReadAllText 可以将整个文件内容读取为一个字符串。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 读取文件内容
        string content = File.ReadAllText(filePath);

        Console.WriteLine("文件内容:");
        Console.WriteLine(content);
    }
}

特点

  • 适合读取小型文本文件。
  • 一次性读取全部内容。

2.2 使用 File.ReadAllLines

File.ReadAllLines 可以将文件内容逐行读取为一个字符串数组。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 读取文件内容
        string[] lines = File.ReadAllLines(filePath);

        Console.WriteLine("文件内容:");
        foreach (string line in lines)
        {
            Console.WriteLine(line);
        }
    }
}

特点

  • 适合逐行处理文件内容。
  • 返回字符串数组,便于逐行操作。

3. 文件写入的高级操作

3.1 使用 FileStream

FileStream 提供了更灵活的文件写入方式,适合处理大文件或需要精确控制写入过程的场景。

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        string content = "Hello, this is written using FileStream!";

        // 创建 FileStream 对象
        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            // 将字符串转换为字节数组
            byte[] data = Encoding.UTF8.GetBytes(content);

            // 写入文件
            fs.Write(data, 0, data.Length);
        }

        Console.WriteLine("文件写入成功!");
    }
}

特点

  • 支持二进制数据和文本数据。
  • 可以控制文件的打开模式(如FileMode.CreateFileMode.Append等)。

3.2 使用 StreamWriter

StreamWriter 是一个更高级的文本写入工具,它封装了FileStream,提供了更方便的文本写入方法。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 创建 StreamWriter 对象
        using (StreamWriter writer = new StreamWriter(filePath))
        {
            // 写入文本
            writer.WriteLine("This is the first line.");
            writer.WriteLine("This is the second line.");
        }

        Console.WriteLine("文件写入成功!");
    }
}

特点

  • 支持逐行写入。
  • 支持自动刷新缓冲区。
  • 可以指定编码格式。

4. 文件读取的高级操作

4.1 使用 FileStream

FileStream 也可以用于文件读取,适合处理大文件或需要精确控制读取过程的场景。

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 创建 FileStream 对象
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            // 创建字节数组存储文件内容
            byte[] data = new byte[fs.Length];

            // 读取文件内容
            fs.Read(data, 0, data.Length);

            // 将字节数组转换为字符串
            string content = Encoding.UTF8.GetString(data);

            Console.WriteLine("文件内容:");
            Console.WriteLine(content);
        }
    }
}

特点

  • 支持二进制数据和文本数据。
  • 可以控制文件的打开模式(如FileMode.OpenFileMode.OpenOrCreate等)。

4.2 使用 StreamReader

StreamReader 是一个更高级的文本读取工具,它封装了FileStream,提供了更方便的文本读取方法。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 创建 StreamReader 对象
        using (StreamReader reader = new StreamReader(filePath))
        {
            // 逐行读取文件内容
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }
    }
}

特点

  • 支持逐行读取。
  • 支持自动检测文件编码。

5. 文件操作的最佳实践

5.1 异常处理

文件操作可能会抛出异常(如文件路径无效、权限不足等),因此建议使用try-catch块来处理异常。

try
{
    string content = File.ReadAllText("example.txt");
    Console.WriteLine(content);
}
catch (Exception ex)
{
    Console.WriteLine("文件操作失败: " + ex.Message);
}

5.2 使用 using 语句

对于FileStreamStreamReaderStreamWriter等需要显式释放资源的对象,建议使用using语句,以确保资源被正确释放。

using (StreamWriter writer = new StreamWriter("example.txt"))
{
    writer.WriteLine("Hello, World!");
}

5.3 选择适当的读写方式

  • 对于小型文件,使用File.ReadAllTextFile.WriteAllText
  • 对于大型文件或需要逐行处理的场景,使用StreamReaderStreamWriter

6. 总结

C#提供了丰富的文件读写方法,从简单的File类到高级的FileStreamStreamReader/StreamWriter,每种方式都有其适用的场景。通过本文的介绍,你应该能够根据实际需求选择合适的文件操作方法,并掌握文件读写的最佳实践。

如果你有任何问题或建议,欢迎在评论区留言!


http://www.niftyadmin.cn/n/5824516.html

相关文章

UML系列之Rational Rose笔记四:时序图(顺序图_序列图)

时序图有很多画法,这基本上能算rose里面要求最乱的一种图了;有些人的需求是BCE模式,这是正常规范点的,有些人就不需要,有些需要用数据库交互,有些不需要;没有一个较为统一的需求;在此…

pytest-instafail:让测试失败信息即时反馈

pytest-instafail:让测试失败信息即时反馈 前言一、简介二、优势三、安装与使用3.1 未安装时运行情况3.2 安装3.3 已安装时运行情况3.3 pytest.ini 配置选项 四、对比 总结 前言 当测试用例数量庞大时,定位测试失败的原因往往耗时费力。此时,…

vue3学习日记5 - 项目起步

最近发现职场前端用的框架大多为vue,所以最近也跟着黑马程序员vue3的课程进行学习,以下是我的学习记录 视频网址: Day2-11.项目起步-静态资源引入和ErrorLen安装_哔哩哔哩_bilibili 学习日记: vue3学习日记1 - 环境搭建-CSDN博…

JavaScript解决HTML页面Windows在不同缩放比例下的显示问题和Bootstrap模态框阴影遮盖问题

在项目开发中,我们通常以100%的缩放比例来设计页面样式,但是在客户的电脑上,由于屏幕的不同分辨率和缩放比例,可能导致页面显示错乱的问题。为了解决这个问题,我们可以使用一些JavaScript代码来进行屏幕适配。 首先&a…

查看当前Ubuntu服务器Linux的一些信息指令

一、查看系统信息 1.查看操作系统版本和内核信息 uname -a该命令会显示系统内核的名称、版本、主机名、处理器类型等信息。 2.查看系统详细信息 lsb_release -a该命令会显示Ubuntu发行版的详细描述,包括发行版名称、版本号、代号和架构。 3.查看系统启动时间和…

【Linux】进程结束和进程等待

进程的结束 退出码的认识 在我们学习C/C的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢?? 我们知道当在主函数中调用其他函数或者在其他函…

【C++】PP5015 [NOIP2018 普及组] 标题统计

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示数据规模与约定 💯方法分析方法1:我的做法实…

身份鉴权(PHP)(小迪网络安全笔记~

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…