为什么掌握 C# 中的文件操作是一项超能力?
\n\n想象一下,您正在编写一个需要保存用户设置、记录错误或处理数千个文档的程序。如果没有文件系统操作技能,您将寸步难行。在 C# 中,文件操作不仅仅是枯燥地读取行。它是创建强大工具、解析器甚至迷你数据库的机会。
\n\n在本文中,我们将全面解析:从简单的 File.ReadAllText 到高级的流和文件夹操作。您将学习如何不丢失数据、如何优化大文件读取以及如何绕过文件系统的“陷阱”。开始吧!
英雄类:File、FileInfo、Directory 和 Path
\n\n在 .NET 中,有两种文件操作方法:File 类的静态方法和 FileInfo 类的实例方法。前者适用于“读取-写入”的快速操作,后者适用于需要长时间处理单个文件并保持状态的情况。
File vs FileInfo:何时使用哪个?
\n\nFile 是一个静态类。您编写 File.Exists("test.txt") 即可。很方便,但每次操作时系统都会重新检查路径。
FileInfo — 您创建一次对象,然后调用方法。如果您对同一个文件执行多个操作,这会更快。
\n\n// 快速方法\nif (File.Exists(@"C:\\data\\log.txt"))\n{\n string content = File.ReadAllText(@"C:\\data\\log.txt");\n Console.WriteLine(content);\n}\n\n// 专业方法\nFileInfo fileInfo = new FileInfo(@"C:\\data\\log.txt");\nif (fileInfo.Exists)\n{\n using (StreamReader reader = fileInfo.OpenText())\n {\n string content = reader.ReadToEnd();\n Console.WriteLine(content);\n }\n}\n\n\nDirectory 类遵循相同的原则——用于快速文件夹操作的静态方法。Path 是拼接路径的得力助手:Path.Combine("folder", "file.txt") 会自动添加正确的斜杠。
读取文件:从小文件到巨型文件
\n\n在 C# 中读取文件是在简单性和性能之间取得平衡的艺术。让我们分析三个层次。
\n\n层次 1:一次性读取(适用于小文件)
\n\n如果文件大小不超过 10 MB,请放心使用 ReadAllText 或 ReadAllLines。
string text = File.ReadAllText("config.json");\nstring[] lines = File.ReadAllLines("users.csv");\n\n\n缺点:对于大文件,您可能会遇到 OutOfMemoryException。
层次 2:逐行读取(适用于中等文件)
\n\n使用 StreamReader — 逐行读取,不将全部内容加载到内存中。
using (StreamReader reader = new StreamReader("big_log.txt"))\n{\n string line;\n while ((line = reader.ReadLine()) != null)\n {\n Console.WriteLine(line); // 处理每一行\n }\n}\n\n\n请注意 using — 它确保即使发生错误,文件也会被关闭。
层次 3:读取二进制数据(适用于专业人士)
\n\n处理图像、存档或任何非文本文件需要 FileStream。
using (FileStream fs = new FileStream("photo.jpg", FileMode.Open, FileAccess.Read))\n{\n byte[] buffer = new byte[1024];\n int bytesRead;\n while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)\n {\n // 处理数据块\n Console.WriteLine($"已读取 {bytesRead} 字节");\n }\n}\n\n\n写入文件:如何不丢失数据
\n\n在 C# 中写入不仅仅是 File.WriteAllText。理解模式很重要:创建新文件、追加到末尾或覆盖。
FileMode 的主要模式
\n- \n
- CreateNew<