C# 读写文件
C# 中的文件输入和输出 (I/O) 操作是许多软件应用程序的重要组成部分,允许开发人员高效地读取和写入文件。 无论您是存储数据、记录应用程序事件,还是处理大量文本或二进制数据,C# 都提供了强大的文件处理工具。 在 Tim Corey 的视频"C# 数据访问:文本文件"中,他详细介绍了这些文件操作,重点是如何使用文本文件进行数据存储和检索。 本文旨在总结 Tim 在视频中涉及的关键概念和技术,为您提供 C# 中文件 I/O 操作的实用见解。
简介
在 C# 中,文件输入和输出操作对于文本文件的读取和写入至关重要。 File 类提供了与现有文件交互或创建新文件的静态方法。 StreamReader 和 StreamWriter 常用于读取和写入文件。 StreamReader 按行读取文件,允许您访问每一行文本或字符串数组。 您也可以使用 while 循环来有效地读取较大的文件。 StreamWriter 类用于将数据写入文件,支持写入字符串和数组。 它可以用于将文本附加到现有文件或覆盖整个文件。像 WriteLine 和 WriteText 这样的方法允许轻松地在文本文件中操作数据。
这些操作通常在 static void Main 方法中执行,在此定义文件路径。 例如,您可以指定一个文件名并使用 StreamWriter 写入单个字符串或整个字符串数组。 using 语句确保文件在操作后正确关闭,防止资源泄漏。 StreamReader 也可用于按行读取文件,并可处理异常以管理当文件不存在或无法访问的潜在错误。 这些文件 I/O 功能使 C# 成为高效处理文件的绝佳选择。
Tim 通过强调 C# 中文本文件读取和写入的简单性引入主题。 他演示了几行代码如何实现这些任务,使文本文件成为数据存储的可行选择。
创建演示控制台应用程序
Tim 首先使用 Visual Studio 创建了一个名为 "TextFileDataAccessDemo "的新控制台应用程序。
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
namespace TextFileDataAccessDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine(); // Keeps the console window open to view the output
}
}
}using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
namespace TextFileDataAccessDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine(); // Keeps the console window open to view the output
}
}
}他解释了如何使用 Console.ReadLine 来保持控制台窗口打开,让用户看到输出。
读取文本文件
Tim 展示了如何使用 File.ReadAllLines 方法从文本文件中读取数据。 他展示了如何处理文件路径和使用字符串字面量来避免转义字符。
string filePath = @"C:\demos\test.txt";
List<string> lines = File.ReadAllLines(filePath).ToList();string filePath = @"C:\demos\test.txt";
List<string> lines = File.ReadAllLines(filePath).ToList();File.ReadAllLines 方法从指定的文件中读取所有行,并将它们作为字符串数组返回。 Tim 将数组转换为列表,以便于操作。
写入文本文件
Tim 解释了如何使用 File.WriteAllLines 方法将数据写入文本文件。 他演示了如何在列表中添加新行,并将更新后的列表写回文件。
lines.Add("Sue,Storm,WWIStorm.com");
File.WriteAllLines(filePath, lines);lines.Add("Sue,Storm,WWIStorm.com");
File.WriteAllLines(filePath, lines);这段代码将一个新条目添加到列表中,并将整个列表写回文件。
创建数据模型并从文件中填充数据模型
Tim 创建了一个 Person 类来表示文本文件中每个条目的数据结构。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string URL { get; set; }
}public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string URL { get; set; }
}然后他读取文件并填充 Person 对象的列表。
List<Person> people = new List<Person>();
List<string> lines = File.ReadAllLines(filePath).ToList();
foreach (string line in lines)
{
string[] entries = line.Split(',');
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}List<Person> people = new List<Person>();
List<string> lines = File.ReadAllLines(filePath).ToList();
foreach (string line in lines)
{
string[] entries = line.Split(',');
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}此代码读取每一行,按逗号拆分,并用提取的数据创建一个 Person 对象。
字符串插值
Tim 介绍了字符串插值,这是 C# 6.0 中的一项功能,可以简化变量和字符串的组合过程。 此方法在字符串前使用 $ 符号和大括号 {},以便直接在字符串内嵌入变量。
foreach (var person in people)
{
Console.WriteLine($"{person.FirstName} {person.LastName}: {person.URL}");
}foreach (var person in people)
{
Console.WriteLine($"{person.FirstName} {person.LastName}: {person.URL}");
}与使用 + 运算符的传统连接方法相比,这种语法更加简洁和高效。

数据验证
Tim 强调了从文本文件读取数据时验证数据的重要性。他指出了假设数据结构的风险,并建议检查拆分条目的长度。
foreach (string line in lines)
{
string[] entries = line.Split(',');
if (entries.Length == 3)
{
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}
else
{
// Handle error
Console.WriteLine("Invalid data format.");
}
}foreach (string line in lines)
{
string[] entries = line.Split(',');
if (entries.Length == 3)
{
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}
else
{
// Handle error
Console.WriteLine("Invalid data format.");
}
}这样可以确保只处理条目数量正确的行,避免潜在的运行时错误。
向列表中添加对象
Tim 演示了如何向列表中添加新对象。他使用 Person 类的匿名实例向列表中添加一个新人。
people.Add(new Person { FirstName = "Greg", LastName = "Jones", URL = "WOWT.com" });people.Add(new Person { FirstName = "Greg", LastName = "Jones", URL = "WOWT.com" });这将在单行中创建并初始化一个新的 Person 对象,然后将其添加到 people 列表中。
将数据写回文本文件
Tim 解释了如何将 Person 对象列表写回文本文件。他将 Person 对象的列表转换为字符串列表,其中每个字符串代表文件中的一行。
List<string> output = new List<string>();
foreach (var person in people)
{
output.Add($"{person.FirstName},{person.LastName},{person.URL}");
}
File.WriteAllLines(filePath, output);List<string> output = new List<string>();
foreach (var person in people)
{
output.Add($"{person.FirstName},{person.LastName},{person.URL}");
}
File.WriteAllLines(filePath, output);此代码迭代 people 列表,为每个 Person 对象创建一个 CSV 字符串,并将字符串列表写入文件。
结论
Tim Corey 的 C# 文件 I/O 操作详细指南提供了从文本文件读取和向文本文件写入的实用见解。 按照他的示例,开发人员可以有效地使用文本文件管理数据,并实施强大的数据存储解决方案。 如需深入了解和亲身体验,我强烈建议您观看 Tim Corey 的视频,他在视频中通过实际案例深入探讨了这些概念。

