一文详解C#文件的输入与输出

 更新时间:2026年07月14日 09:02:34   作者:逝水无殇  
还在为C#文件读写发愁,本文带你轻松掌握System.IO命名空间下的File、Directory、Path、FileStream等核心类,从基础创建到高效处理大文件,手把手教你用StreamReader/StreamWriter实现文本操作,需要的朋友可以参考下

文件输入与输出(File Input/Output,简称 File I/O)是 C# 开发中最常用的功能之一,几乎所有应用程序都会涉及文件操作,例如:

  • 📄 保存配置文件
  • 📄 读取日志
  • 📄 导入导出 Excel、CSV
  • 📄 保存图片、视频
  • 📄 写入缓存数据
  • 📄 上传下载文件

C# 提供了丰富的文件操作类,它们主要位于:

using System.IO;

一、C# 文件操作类

System.IO 命名空间中最常见的类如下:

作用
File文件操作(静态类)
FileInfo文件对象操作
Directory文件夹操作
DirectoryInfo文件夹对象
Path路径处理
Stream数据流基类
FileStream文件流
StreamReader文本读取
StreamWriter文本写入
BinaryReader二进制读取
BinaryWriter二进制写入

其中:

90%的开发中最常用的是 File、Directory、Path、FileStream、StreamReader、StreamWriter。

二、File 类

File 是一个静态类,可以直接使用。

例如:

File.Exists();

无需实例化。

判断文件是否存在

string path = @"D:\test.txt";

if (File.Exists(path))
{
    Console.WriteLine("文件存在");
}
else
{
    Console.WriteLine("文件不存在");
}

输出:

文件存在

创建文件

File.Create(@"D:\demo.txt");

注意:

Create() 返回一个 FileStream。

通常这样写:

File.Create(path).Close();

否则文件一直被占用。

删除文件

File.Delete(@"D:\demo.txt");

如果文件不存在,不会报错。

复制文件

File.Copy(
    @"D:\a.txt",
    @"D:\b.txt"
);

允许覆盖:

File.Copy(
    @"D:\a.txt",
    @"D:\b.txt",
    true
);

移动文件

File.Move(
    @"D:\a.txt",
    @"D:\Data\a.txt"
);

重命名文件

实际上就是 Move。

File.Move(
    @"D:\a.txt",
    @"D:\new.txt"
);

三、读取文本文件

ReadAllText()

适合:

  • 小文件
  • 配置文件
  • JSON
  • XML

例如:

string text = File.ReadAllText(@"D:\test.txt");

Console.WriteLine(text);

文件:

Hello 
C# 
.NET

输出:

Hello 
C# 
.NET

ReadAllLines()

按行读取。

string[] lines = File.ReadAllLines(@"D:\test.txt");

foreach (string line in lines)
{
    Console.WriteLine(line);
}

输出:

Hello 
C# 
.NET

ReadLines()

懒加载。

适合:

超大文件

foreach (string line in File.ReadLines(path))
{
    Console.WriteLine(line);
}

优点:

不会一次性加载整个文件。

四、写入文本

WriteAllText()

覆盖整个文件。

File.WriteAllText(
    @"D:\test.txt",
    "Hello World"
);

结果:

Hello World

原内容全部消失。

WriteAllLines()

string[] lines =
{
    "Java",
    "C#",
    ".NET"
};

File.WriteAllLines(
    @"D:\test.txt",
    lines
);

结果:

Java 
C# 
.NET

AppendAllText()

追加内容。

File.AppendAllText(
    @"D:\test.txt",
    "\n新增内容"
);

结果:

Hello 
新增内容

五、Directory 文件夹操作

判断目录

Directory.Exists(path);

创建目录

Directory.CreateDirectory(@"D:\Data");

即使目录存在,也不会报错。

删除目录

Directory.Delete(path);

删除非空目录:

Directory.Delete(path, true);

第二个参数:

true

表示递归删除。

获取所有文件

string[] files =
    Directory.GetFiles(@"D:\Data");

遍历:

foreach (string file in files)
{
    Console.WriteLine(file);
}

获取所有目录

Directory.GetDirectories(path);

六、Path 路径操作

Path 专门处理路径。

获取文件名

string name = 
Path.GetFileName(path);

结果:

demo.txt

获取扩展名

Path.GetExtension(path);

结果:

.txt

获取文件名(无扩展)

Path.GetFileNameWithoutExtension(path);

结果:

demo

获取目录

Path.GetDirectoryName(path);

结果:

D:\Data

拼接路径

推荐:

string path =
Path.Combine(
    @"D:\Data",
    "demo.txt"
);

不要:

"D:\\Data\\" + file;

七、FileStream 文件流

所有文件操作最终都基于 Stream。

创建:

FileStream fs = new FileStream(
    @"D:\demo.txt",
    FileMode.OpenOrCreate,
    FileAccess.ReadWrite
);

参数:

参数说明
路径文件路径
FileMode打开方式
FileAccess权限

FileMode 常用值

枚举说明
Create创建
Open打开
OpenOrCreate打开或创建
Append追加
CreateNew新建
Truncate清空

八、写入 FileStream

string text = "Hello";

byte[] buffer =
Encoding.UTF8.GetBytes(text);

using FileStream fs =
new FileStream(
    @"D:\demo.txt",
    FileMode.Create
);

fs.Write(buffer, 0, buffer.Length);

九、读取 FileStream

using FileStream fs =
new FileStream(
    @"D:\demo.txt",
    FileMode.Open
);

byte[] buffer =
new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

string text =
Encoding.UTF8.GetString(buffer);

Console.WriteLine(text);

十、StreamWriter

写文本最常用。

using StreamWriter sw =
new StreamWriter(@"D:\test.txt");

sw.WriteLine("Hello");
sw.WriteLine("C#");
sw.WriteLine(".NET");

生成:

Hello 
C# 
.NET

追加:

using StreamWriter sw =
new StreamWriter(path, true);

第二个参数:

true

表示追加。

十一、StreamReader

读取文本。

using StreamReader sr =
new StreamReader(@"D:\test.txt");

string text = sr.ReadToEnd();

Console.WriteLine(text);

按行读取:

string line;

while ((line = sr.ReadLine()) != null)
{
    Console.WriteLine(line);
}

十二、BinaryWriter

写二进制。

using BinaryWriter bw =
new BinaryWriter(
    File.Open("data.bin",
    FileMode.Create)
);

bw.Write(100);
bw.Write(3.14);
bw.Write("Hello");

十三、BinaryReader

读取二进制。

using BinaryReader br =
new BinaryReader(
    File.Open("data.bin",
    FileMode.Open)
);

Console.WriteLine(br.ReadInt32());
Console.WriteLine(br.ReadDouble());
Console.WriteLine(br.ReadString());

输出:

100 
3.14 
Hello

十四、using的重要性

推荐始终使用 using 管理文件资源,它会在代码块结束时自动释放文件句柄,避免文件被占用:

using StreamWriter sw = new StreamWriter("test.txt");
sw.WriteLine("Hello");

对于较旧版本的 C#,也可以使用:

using (StreamWriter sw = new StreamWriter("test.txt"))
{
    sw.WriteLine("Hello");
}

十五、异常处理

文件操作经常会遇到异常,例如:

  • 文件不存在
  • 没有访问权限
  • 文件被其他程序占用
  • 路径非法
  • 磁盘空间不足

建议配合 try...catch 使用:

try
{
    string text = File.ReadAllText(@"D:\test.txt");
    Console.WriteLine(text);
}
catch (FileNotFoundException)
{
    Console.WriteLine("文件不存在");
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("没有访问权限");
}
catch (IOException ex)
{
    Console.WriteLine($"I/O 错误:{ex.Message}");
}

十六、最佳实践

  • 使用 Path.Combine() 拼接路径,避免手动拼接分隔符。
  • 文本文件优先使用 File.ReadAllText()File.WriteAllText() 等高级 API,代码更简洁。
  • 处理大文件时使用 File.ReadLines()StreamReader,避免一次性加载到内存。
  • 使用 using 自动释放文件资源,防止文件锁定。
  • 对所有文件操作做好异常处理,提高程序健壮性。
  • 根据文件类型选择合适的读取方式:文本使用 StreamReader,二进制数据使用 BinaryReader/BinaryWriter

十七、总结

操作推荐 API
判断文件是否存在File.Exists()
创建文件File.Create()
删除文件File.Delete()
复制文件File.Copy()
移动/重命名File.Move()
读取整个文本File.ReadAllText()
按行读取File.ReadLines() / StreamReader
写入整个文本File.WriteAllText()
追加文本File.AppendAllText() / StreamWriter
文件夹操作Directory
路径处理Path
大文件读写FileStream
文本流StreamReader / StreamWriter
二进制数据BinaryReader / BinaryWriter

掌握 System.IO 中的这些核心类和 API,可以满足绝大多数 C# 文件读写需求,也是开发桌面应用、Web API、Windows 服务等项目的基础技能。

以上就是一文详解C#文件的输入与输出的详细内容,更多关于C#文件的输入与输出的资料请关注脚本之家其它相关文章!

相关文章

  • C#中简单Socket编程的实现实例

    C#中简单Socket编程的实现实例

    本文主要介绍了C#中简单Socket编程的实现实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • C#中word导出功能的骚操作详解

    C#中word导出功能的骚操作详解

    这篇文章主要给大家介绍了关于C#中word导出功能骚操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C#中简单的拆箱操作用法实例分析

    C#中简单的拆箱操作用法实例分析

    这篇文章主要介绍了C#中简单的拆箱操作用法.实例分析了C#中拆箱的概念与相关的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c#字符串编码编码(encoding)使用方法示例

    c#字符串编码编码(encoding)使用方法示例

    System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法。使Unicode字符数组的字符串,转换为指定编码的字节数组,或者反之,看下面的例子
    2013-12-12
  • C# SQLite序列操作实现方法详解

    C# SQLite序列操作实现方法详解

    这篇文章主要介绍了C# SQLite序列操作实现方法,结合实例形式详细分析了C#实现SQLite序列操作的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • 通过C#代码轻松移除Word文档中的文本与图片水印

    通过C#代码轻松移除Word文档中的文本与图片水印

    在日常工作和学习中,我们经常会遇到带有水印的Word文档,它们有时会影响文档的阅读体验,甚至在打印时造成不便,手动逐一删除这些水印不仅效率低下,而且对于大量文档来说更是一项艰巨的任务,所以借助强大的C#编程,轻松实现Word文档水印的批量移除
    2026-02-02
  • C# wpf简单颜色板的实现

    C# wpf简单颜色板的实现

    wpf本身没有提供颜色板之类的控件,有些业务使用场景需要使用颜色板之类的控件,本文就简单实现,感兴趣的可以了解一下
    2021-10-10
  • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)

    使用XmlSerializer序列化List对象成XML格式(list对象序列化)

    这篇文章主要介绍了使用XmlSerializer序列化List对象成XML格式(list对象序列化),需要的朋友可以参考下
    2014-03-03
  • 区分c# 前台和后台线程

    区分c# 前台和后台线程

    这篇文章主要介绍了c# 前台线程和后台线程的区别与联系,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 如何使用C#修改本地Windows系统时间

    如何使用C#修改本地Windows系统时间

    这篇文章主要介绍了如何使用C#修改本地Windows系统时间,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01

最新评论