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对象列表转换为字符串列表,其中每个字符串代表文件中的一行。
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 的视频,他在视频中通过实际案例深入探讨了这些概念。

