文件I/O
C#提供了多种方式来读写文件,主要通过System.IO
命名空间中的类来实现,下方会列一些常用的类型:
-
StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。
-
BinaryReader/BinaryWriter:用于以二进制格式读取或写入基本数据类型。
-
FileStream:提供对文件的基本读写操作,并支持随机访问文件。
-
File 和 Directory 类:提供了一组静态方法,用于创建、复制、删除、移动文件和目录,以及检查文件和目录是否存在等。
使用StreamReader和StreamWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 写入文本到文件using (StreamWriter writer = new StreamWriter(path)){writer.WriteLine("Hello, world!");}// 从文件读取文本using (StreamReader reader = new StreamReader(path)){string content = reader.ReadToEnd();Console.WriteLine(content);}}
}
使用BinaryReader和BinaryWriter
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 创建或覆盖文件,并准备写入using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create))){writer.Write(123); // 写入整数writer.Write(3.14f); // 写入单精度浮点数writer.Write("Hello, World!"); // 写入字符串}Console.WriteLine("Data written to file.");}
}
using System;
using System.IO;class Program
{static void Main(){string path = "example.dat";// 打开文件进行读取using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))){int intValue = reader.ReadInt32(); // 读取整数float floatValue = reader.ReadSingle(); // 读取单精度浮点数string stringValue = reader.ReadString(); // 读取字符串Console.WriteLine($"Integer Value: {intValue}");Console.WriteLine($"Float Value: {floatValue}");Console.WriteLine($"String Value: {stringValue}");}}
}
注意事项
-
顺序:当你使用
BinaryWriter
写入数据时,必须记住写入数据的顺序,因为在使用BinaryReader
读取数据时,你也需要按照相同的顺序来读取这些数据。 -
编码:默认情况下,
BinaryWriter
使用 UTF-8 编码写入字符串。如果你需要不同的编码,可以在创建BinaryWriter
实例时指定编码方式。 -
异常处理:在实际应用中,你应该添加适当的错误处理代码(如 try-catch 块),以便处理可能发生的 I/O 错误或其他异常情况。
通过 BinaryReader
和 BinaryWriter
,你可以高效地对基本数据类型进行二进制格式的读写操作,这对于处理大量数据或者需要精确控制数据存储格式的情况特别有用。然而,请注意,对于复杂的对象序列化,你可能需要考虑其他方法,比如 XML 或 JSON 序列化。
使用FileStream
创建和写入文件
using System;
using System.IO;
using System.Text;class Program
{static void Main(){string path = "example.txt";string content = "Hello, World!";// 使用 FileStream 创建或覆盖文件,并准备写入using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write)){byte[] info = new UTF8Encoding(true).GetBytes(content);// 将字节数组写入文件fs.Write(info, 0, info.Length);}Console.WriteLine("Data written to file.");}
}
读取文件
using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 使用 FileStream 打开文件进行读取using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)){byte[] b = new byte[1024];UTF8Encoding temp = new UTF8Encoding(true);// 循环读取文件中的所有数据while (fs.Read(b, 0, b.Length) > 0){Console.WriteLine(temp.GetString(b));}}}
}
使用File 和 Directory 类
常用的 File
方法包括:
-
Create
: 创建或覆盖指定路径上的文件。 -
Copy
: 将现有文件复制到新位置,可以选择是否覆盖目标位置的现有文件。 -
Delete
: 删除指定的文件。 -
Exists
: 判断指定的文件是否存在。 -
Move
: 移动指定的文件到新位置。 -
ReadAllBytes
,ReadAllLines
,ReadAllText
: 读取文件的内容为字节数组、字符串数组或单个字符串。 -
WriteAllBytes
,WriteAllLines
,WriteAllText
: 将字节数组、字符串数组或单个字符串写入文件。
string sourceFile = @"C:\source\example.txt";
string destFile = @"D:\destination\example.txt";if (!File.Exists(destFile))
{File.Copy(sourceFile, destFile, true);
}
常用的 Directory
方法包括:
-
CreateDirectory
: 创建指定路径中的所有目录和子目录。 -
Delete
: 删除指定的目录及其内容。 -
Exists
: 判断指定的目录是否存在。 -
GetDirectories
: 获取指定目录中的子目录名称。 -
GetFiles
: 获取指定目录中的文件名称。 -
Move
: 将指定的目录及其内容移动到新位置。 -
EnumerateDirectories
,EnumerateFiles
: 遍历目录或文件集合,支持延迟执行。
string newDirPath = @"C:\newfolder";if (!Directory.Exists(newDirPath))
{Directory.CreateDirectory(newDirPath);
}
File 和 Directory注意事项:
当使用 File
或 Directory
类的静态方法可能更方便。但是,如果计划多次重用某个对象,考虑使用 FileInfo
或 DirectoryInfo
类的实例方法,因为这可以避免重复的安全检查并可能提高性能。
请注意,尽管 BinaryFormatter
曾经是一个流行的序列化工具,但出于安全性和兼容性的考虑,在新的开发工作中应避免使用它,而转向其他更安全的替代方案,如 JSON 序列化。不过,这一建议与 File
和 Directory
类的主要用途并不直接相关,这里只是作为补充信息提供。