C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#文件的输入与输出

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

作者:逝水无殇

还在为C#文件读写发愁,本文带你轻松掌握System.IO命名空间下的File、Directory、Path、FileStream等核心类,从基础创建到高效处理大文件,手把手教你用StreamReader/StreamWriter实现文本操作,需要的朋友可以参考下

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

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()

适合:

例如:

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}");
}

十六、最佳实践

十七、总结

操作推荐 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#文件的输入与输出的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文