如何写入文本文件(C# 编程指南)
本文提供了几个示例,演示了将文本写入文件的多种方法。 前两个示例使用 System.IO.File 类上的静态便捷方法将任意 IEnumerable<string> 的每个元素和 string 写入文本文件。 第三个示例演示了在写入文件时必须分别处理文本的每一行的情况下,如何将文本添加到文件。 在前三个示例中,会覆盖文件中的所有现有内容。 最后一个示例演示如何将文本追加到现有文件。
这些示例都将字符串文本写入了文件。 如果想设置写入文件的文本的格式,请使用 Format 方法或 C# 字符串内插功能。
将字符串的集合写入文件
class WriteAllLines
{
public static async Task ExampleAsync()
{
string[] lines =
{
"First line", "Second line", "Third line"
};
await File.WriteAllLinesAsync("WriteLines.txt", lines);
}
}
前面的源代码示例:
使用三个值实例化字符串数组。
等待对 File.WriteAllLinesAsync 的调用完成,该调用会执行以下操作:
- 以异步方式创建一个名为“WriteLines.txt”的文件。 如果该文件已存在,则会覆盖该文件。
- 将给定行写入该文件。
- 关闭该文件,并根据需要自动刷新和释放。
向文件写入一个字符串
class WriteAllText
{
public static async Task ExampleAsync()
{
string text =
"A class is the most powerful data type in C#. Like a structure, " +
"a class defines the data and behavior of the data type. ";
await File.WriteAllTextAsync("WriteText.txt", text);
}
}
前面的源代码示例:
根据指定的字符串字面量实例化一个字符串。
等待对 File.WriteAllTextAsync 的调用完成,该调用会执行以下操作:
- 以异步方式创建一个名为“WriteText.txt”的文件。 如果该文件已存在,则会覆盖该文件。
- 将给定文本写入该文件。
- 关闭该文件,并根据需要自动刷新和释放。
将数组中的选定字符串写入文件
class StreamWriterOne
{
public static async Task ExampleAsync()
{
string[] lines = { "First line", "Second line", "Third line" };
using StreamWriter file = new("WriteLines2.txt");
foreach (string line in lines)
{
if (!line.Contains("Second"))
{
await file.WriteLineAsync(line);
}
}
}
}
前面的源代码示例:
- 使用三个值实例化字符串数组。
- 以 using 声明的形式使用 WriteLines2.txt 的文件路径实例化 StreamWriter。
- 循环访问所有行。
- 有条件地等待对 StreamWriter.WriteLineAsync(String) 的调用完成,该调用在行不包含
"Second"时将该行写入文件。
将文本追加到现有文件
class StreamWriterTwo
{
public static async Task ExampleAsync()
{
using StreamWriter file = new("WriteLines2.txt", append: true);
await file.WriteLineAsync("Fourth line");
}
}
前面的源代码示例:
- 使用三个值实例化字符串数组。
- 以 using 声明的形式使用 WriteLines2.txt 的文件路径实例化 StreamWriter,并传入要追加的
true。 - 等待对 StreamWriter.WriteLineAsync(String) 的调用完成,该调用将字符串作为追加行写入文件。
异常
以下情况可能会导致异常:
- InvalidOperationException:文件已存在并且为只读。
- PathTooLongException:路径名可能太长。
- IOException:磁盘可能已满。
使用文件系统时,还有其他可能会导致异常的情况,因此最好进行防御性编程。