ZetCode

C# 文件

最后修改于 2025 年 5 月 12 日

本教程探讨了 C# 中的文件处理,涵盖了诸如创建、读取、写入、删除和附加文件等基本操作。

在 C# 中,文件管理使用 System.IOSystem.Text 命名空间来处理,为文件操作提供了有效的工具。

System.IO 中的 File 类提供了用于基本文件操作的静态方法,包括创建、复制、删除、移动和打开。它还方便了创建用于高级文件操作的 FileStream 对象。

对于面向对象的文件处理,.NET 提供了 FileInfo 类。虽然 FileInfo 表示具有详细属性的单个文件实例,但 File 作为一个实用程序类,用于管理应用程序中的文件。

words.txt 文件

这是一个文本文件,我们将在一些示例中使用它。

words.txt
sky
blue
cloud
raisin
tree
falcon
owl
eagle
rock
water
lake

C# File.Create

File.Create 在指定的路径中创建或覆盖文件。它返回一个 FileStream,该 FileStream 提供对路径中指定文件的读/写访问权限。

Program.cs
using System.Text;

var path = "words.txt";

using FileStream fs = File.Create(path);
byte[] data = Encoding.UTF8.GetBytes("falcon\nribbon\ncloud");
fs.Write(data, 0, data.Length);

Console.WriteLine("data written to file");

该示例创建一个文件并将三个单词写入其中。这演示了如何使用 FileStream 将原始字节写入文件,这在您需要精确控制文件内容或处理二进制数据时非常有用。

using FileStream fs = File.Create(path);

我们创建一个文件并检索该文件的文件流。 此流提供对文件字节的直接访问,从而可以进行高效的读取和写入操作。

byte[] data = Encoding.UTF8.GetBytes("falcon\nribbon\ncloud");

我们使用 Encoding.UTF8.GetBytes 获取要写入的三个单词的字节。 此步骤是必需的,因为文件将数据存储为字节,并且将字符串转换为字节可确保使用正确的编码。

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

字节使用 Write 写入文件。 此方法将指定的字节数组写入文件,从给定的偏移量开始,并写入指定数量的字节。

C# File.CreateText

File.CreateText 创建或打开一个文件,用于写入 UTF-8 编码的文本。 如果该文件已经存在,则其内容将被覆盖。 它返回一个 StreamWriter,该 StreamWriter 使用 UTF-8 编码写入指定的文件。

Program.cs
var path = "words.txt";

using StreamWriter sw = File.CreateText(path);

sw.WriteLine("falcon");
sw.WriteLine("sky");
sw.WriteLine("cloud");

Console.WriteLine("data written to file");

该示例使用 File.CreateText 创建一个新文件。 它使用 WriteLine 写入三个单词。 这种方法对于写入文本数据非常方便,因为 StreamWriter 会自动处理字符编码和行尾符。

C# File.Copy

File.Copy 将现有文件复制到新文件。 它将源文件和目标文件作为参数。

Program.cs
var sourcePath = "words.txt";
var destPath = "words_bck.txt";

File.Copy(sourcePath, destPath);

Console.WriteLine("file copied");

该示例复制一个文本文件。 此操作对于创建备份或复制文件以进行进一步处理而不更改原始文件非常有用。

C# File.Move

File.Move 将指定的文件移动到新位置。 使用此方法,我们可以将文件移动到新位置或重命名文件。

Program.cs
var sourcePath = "words.txt";
var destPath = "data.txt";

File.Move(sourcePath, destPath);

Console.WriteLine("file moved");

该示例将 words.txt 重命名为 data.txt。 这演示了如何将文件移动到新位置或更改其在同一目录中的名称。

C# File.Exists

File.Exists 确定指定的文件是否存在。

Program.cs
var path = "words2.txt";

if (File.Exists(path))
{
    Console.WriteLine("the file exists");
} else {

    Console.WriteLine("the file does not exist");
}

在代码示例中,我们检查 words2.txt 文件是否存在。 这是一个常见的操作,可以防止在尝试访问或修改可能不存在的文件时发生错误。

C# File.Delete

File.Delete 删除指定的文件。

Program.cs
var path = "words.txt";

File.Delete(path);

Console.WriteLine("file deleted");

该示例删除一个文本文件。 删除文件对于管理磁盘空间和从应用程序中删除过时或不必要的数据至关重要。

C# File.GetCreationTime

File.GetCreationTime 返回指定文件或目录的创建日期和时间。

Program.cs
var path = "words.txt";

DateTime dt = File.GetCreationTime(path);

Console.WriteLine($"Creation time: {dt}");

该示例打印 words.txt 文件的创建时间。 知道文件何时创建对于日志记录、审计或管理文件生命周期很有用。

$ dotnet run
Creation time: 16. 1. 2024 11:31:35

C# File.GetLastWriteTime

File.GetLastWriteTime 返回上次写入指定文件或目录的日期和时间。

Program.cs
var path = "words.txt";

DateTime dt = File.GetLastWriteTime(path);

Console.WriteLine($"Last write time: {dt}");

该示例打印文本文件的上次写入时间。 此信息有助于跟踪文件上次修改的时间,这对于同步和备份任务非常重要。

C# File.Open

File.Open 在指定的路径上打开一个 FileStreamFile.Open 的重载方法允许指定文件模式(Open、Create、CreateNew、Truncate、Append 或 OpenOrCreate),文件访问权限(Read、Write、ReadWrite)。

文件共享值指定其他线程对文件的访问类型,例如 Delete、None、Read、ReadWrite、Write 或 Inheritable。

Program.cs
using System.Text;

var path = "words.txt";

using FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);

byte[] buf = new byte[1024];
int c;

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

该示例读取 words.txt 文件的内容。 这演示了如何使用 FileStream 从文件中读取原始字节,并使用特定编码将其转换为字符串。

using FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read);

我们打开文件以进行读取。 这确保以一种方式访问文件,以防止意外修改,同时允许高效地读取数据。

byte[] buf = new byte[1024];
int c;

我们创建一个字节缓冲区和一个辅助变量。 该缓冲区临时保存从文件读取的数据,该变量跟踪实际读取了多少字节。

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

Read 方法从流中读取一个字节块,并将数据写入给定的缓冲区。 Encoding.UTF8.GetString 将字节序列解码为字符串。 这种方法对于分块读取大文件非常有效。

$ dotnet run
sky
blue
cloud
raisin
tree
falcon
owl
eagle
rock
water
lake

C# File.OpenRead

File.OpenRead 打开一个现有文件以进行读取。 它在指定的路径上返回一个只读的 FileStream。 它是 File.Open 的便捷方法。

Program.cs
using System.Text;

var path = "words.txt";

using FileStream fs = File.OpenRead(path);

byte[] buf = new byte[1024];
int c;

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

该示例使用 File.OpenRead 读取文件。 此方法通过返回只读的 FileStream 简化了打开文件以进行读取的操作,从而可以轻松地处理文件数据。

C# File.OpenText

File.OpenText 打开一个现有的 UTF-8 编码文本文件以进行读取。 它在指定的路径上返回一个 StreamReader

Program.cs
var path = "words.txt";

using StreamReader sr = File.OpenText(path);

string s = String.Empty;

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

该示例打开一个文本文件并读取其内容。 使用 StreamReader 允许您逐行读取文本数据,这非常适合处理结构化的文本文件,例如日志或 CSV。

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

我们逐行读取文本文件。 我们不必自己将字节解码为字符串。 StreamReader 处理从字节到字符串的转换,从而使文本处理变得简单。

C# File.OpenWrite

File.OpenWrite 打开一个现有文件或创建一个新文件以进行写入。 它在指定的路径上返回一个具有写入访问权限的 FileStream 对象。

Program.cs
var path = "langs.txt";

using FileStream fs = File.OpenWrite(path);
using StreamWriter sr = new StreamWriter(fs);

sr.WriteLine("PHP\nDart\nJava\nC#\n");

Console.WriteLine("data written");

该示例以写入模式打开一个文件,并将一行写入该文件。 这演示了如何一起使用 FileStreamStreamWriter 来高效地写入文本数据。

using FileStream fs = File.OpenWrite(path);
using StreamWriter sr = new StreamWriter(fs);

我们打开一个到指定路径的文件流。 该流传递到 StreamWriter,后者用于以特定编码(默认为 UTF8)写入字符。 此设置对于将大量文本数据写入文件非常有用。

sr.WriteLine("PHP\nDart\nJava\nC#\n");

使用 WriteLine 将一行文本写入文件。 StreamWriter 自动添加换行符,从而可以轻松地写入多行文本。

C# File.ReadLines

File.ReadLines 方法以延迟方式从文本文件中读取行,返回一个 IEnumerable<string>。 与 File.ReadAllLines 不同,它不会一次将所有行加载到内存中,从而使其对于大型文件更有效。

Program.cs
var path = "words.txt";

var lines = File.ReadLines(path);

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

此示例使用 File.ReadLines 一次从文件中读取一行,从而减少了与 File.ReadAllLines 相比的内存使用量。 使用 foreach 循环遍历返回的可枚举对象,并根据需要处理每一行。 这对于处理大型文件而不将其完全加载到内存中特别有用。

C# File.ReadAllLines

File.ReadAllLines 方法将文本文件的所有行读取到单个操作中的 string[] 数组中。 由于整个文件一次加载到内存中,因此这种方法更适合小型到中等大小的文件。

Program.cs
var path = "words.txt";

string[] lines = File.ReadAllLines(path);

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

此示例一次读取文件中的所有行,并将它们存储在 string[] 数组中。 然后,使用 foreach 循环遍历整个数组。 这种方法适用于内存使用量不是问题的小型到中等大小的文件。

如果使用大型文件,请考虑使用 File.ReadLines 以最大程度地减少内存消耗。 此方法以延迟方式读取行,从而使其对于处理大型文件更有效。

C# File.ReadAllText

File.ReadAllText 打开一个文本文件,将文件中的所有文本读取到字符串中,然后关闭该文件。 请注意,此方法不应用于非常大的文件。

Program.cs
var path = "words.txt";

string readText = File.ReadAllText(path);
Console.WriteLine(readText);

该示例将整个文本一次性读取到字符串中。 这对于快速加载文件的全部内容非常方便,但应避免用于非常大的文件,以防止过度使用内存。

C# File.ReadAllBytes

File.ReadAllBytes 打开一个二进制文件,将文件的内容读取到字节数组中,然后关闭该文件。

Program.cs
var path = "favicon.ico";
byte[] data = File.ReadAllBytes(path);

int i = 0;

foreach (byte c in data)
{
    Console.Write("{0:X2} ", c);
    i++;

    if (i % 10 == 0)
    {
        Console.WriteLine();
    }
}

该示例读取 favicon.ico 二进制文件。 数据以十六进制格式打印到控制台。 这演示了如何处理二进制文件并以人类可读的方式显示其内容。

$ dotnet run
00 00 01 00 01 00 10 10 00 00
00 00 00 00 68 05 00 00 16 00
00 00 28 00 00 00 10 00 00 00
20 00 00 00 01 00 08 00 00 00
00 00 00 01 00 00 00 00 00 00
00 00 00 00 00 01 00 00 00 00
00 00 00 00 00 00 FF FF FF 00
4D 45 3D 00 00 00 00 00 00 00
...

C# File.WriteAllText

File.WriteAllText 创建一个新文件,将内容写入该文件,然后关闭该文件。 如果目标文件已经存在,则会被覆盖。

Program.cs
var path = "words.txt";

string data = "sky\ncloud\nfalcon\nowl\ncrane";
File.WriteAllText(path, data);

Console.WriteLine("data written");

在示例中,我们使用 File.WriteAllText 将四个单词写入文件。 此方法对于快速将文本数据保存到文件(覆盖任何现有内容)非常有用。

C# File.WriteAllLines

File.WriteAllLines 创建一个新文件,将一个或多个字符串写入该文件,然后关闭该文件。

Program.cs
using System.Text;

var path = "words.txt";

string[] data = { "sky", "cloud", "falcon", "hawk" };
File.WriteAllLines(path, data, Encoding.UTF8);

Console.WriteLine("data written");

在示例中,我们有一个字符串数组。 我们使用 File.WriteAllLines 将这些字符串一次性写入文件。 这是一种有效的方式,可以一次将多行文本保存到文件中。

C# File.WriteAllBytes

File.WriteAllBytes 创建一个新文件,将指定的字节数组写入该文件,然后关闭该文件。

Program.cs
using System.Text;

var path = "words.txt";

var text = "falcon\nhawk\nforest\ncloud\nsky";
byte[] data = Encoding.UTF8.GetBytes(text);

File.WriteAllBytes(path, data);

Console.WriteLine("data written");

该示例使用 File.WriteAllBytes 将数据写入文件。 此方法非常适合将二进制数据(例如图像或序列化对象)直接保存到文件。

var text = "falcon\nhawk\nforest\ncloud\nsky";
byte[] data = Encoding.UTF8.GetBytes(text);

首先,我们使用 Encoding.UTF8.GetBytes 将文本数据转换为字节数组。 此转换确保文本被正确编码以作为二进制数据存储。

File.WriteAllBytes(path, data);

然后,我们使用 File.WriteAllBytes 将数组写入文件。 此操作将整个字节数组一步保存到文件中。

C# File.AppendText

File.AppendText 创建一个 StreamWriter,该 StreamWriter 将 UTF-8 编码的文本附加到现有文件,如果指定的文件不存在,则附加到新文件。

Program.cs
var path = "words.txt";

using StreamWriter sw = File.AppendText(path);

sw.WriteLine("sky");
sw.WriteLine("lake");

该示例将两个单词附加到 words.txt 文件。 附加数据对于向现有文件添加新信息而不覆盖其内容很有用。

C# File.AppendAllText

File.AppendAllText 将指定的字符串附加到文件。 如果该文件不存在,则创建该文件。

Program.cs
var path = "words.txt";
var contents = "armour\nsword\narrow\n";

File.AppendAllText(path, contents);

Console.WriteLine("text appended to file");

该示例将三个单词附加到指定的文本文件。 此方法对于将文本添加到文件非常方便,如果文件不存在,则会自动创建该文件。

C# File.AppendAllLines

File.AppendAllLines 将行附加到文件,然后关闭该文件。

Program.cs
var path = "words.txt";
List<string> data = ["brown", "blue", "khaki"];

File.AppendAllLines(path, data);

Console.WriteLine("data written to file");

该示例使用 File.AppendAllLines 将字符串列表附加到文件。 这有助于在单个操作中将多行文本添加到文件。

C# File.Replace

File.Replace 方法将指定文件的内容替换为另一个文件的内容,可以选择创建已替换文件的备份。

Program.cs
var sourceFile = "words.txt";
var destFile = "words2.txt";
var backupFile = "words_backup.txt";

File.Replace(sourceFile, destFile, backupFile);

Console.WriteLine("file replaced");

该示例将 words2.txt 的内容替换为 words.txt 并创建备份。 此操作对于更新文件很有用,同时保留以前的版本,以便在需要时进行恢复。

C# File.SetAttributes 和 File.GetAttributes

File.SetAttributesFile.GetAttributes 方法允许您设置和检索文件属性,例如只读或隐藏。

Program.cs
var path = "words.txt";

File.SetAttributes(path, FileAttributes.ReadOnly);
var attrs = File.GetAttributes(path);

Console.WriteLine($"File attributes: {attrs}");

该示例将文件设置为只读,然后检索并打印其属性。 这演示了如何以编程方式更改文件属性并验证更改,这对于自动化文件管理任务或在 C# 程序中强制执行某些文件访问策略特别有用。

在本文中,我们已经在 C# 中处理了文件。 我们利用了 System.IOFile 类。 提供的示例涵盖了广泛的文件操作,为您提供了在自己的 C# 项目中高效安全地处理文件的实践知识。

来源

C# File 类 - 语言参考

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程