16.7 使用File类型
File类型的静态成员提供了和FileInfo类型差不多的功能。与FileInfo类似,File类提供了AppendText()、Create()、CreateText()、Open()、OpenRead()、OpenWrite()和OpenText()方法。其实,在大多数情况下,File和FileInfo类型能互换使用。例如,前面每一个FileStream示例都可以用File类型来简化:
static void Main(string[] args)
{
// 通过File.Create()获取FileStream对象。
FileStream fs = File.Create(@"C:\Test.dat");
fs.Close();
// 通过File.Open()获取FileStream对象。
FileStream fs2 = File.Open(@"C:\Test2.dat",
FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
fs2.Close();
// 得到一个只读权限的FileStream对象。
FileStream readOnlyStream = File.OpenRead(@"Test3.dat");
readOnlyStream.Close();
// 得到一个只写权限的FileStream对象。
FileStream writeOnlyStream = File.OpenWrite(@"Test4.dat");
writeOnlyStream.Close();
// 得到一个StreamReader对象。
StreamReader sreader = File.OpenText(@"C:\boot.ini");
sreader.Close();
// 得到一些StreamWriter对象。
StreamWriter swriter = File.CreateText(@"C:\Test3.txt");
swriter.Close();
StreamWriter swriterAppend = File.AppendText(@"C:\FinalTest.txt");
swriterAppend.Close();
}
.NET 2.0新增的File成员
和FileInfo不同,File类型提供了一些独有的成员(从.NET 2.0开始),表16-5列举了其中的一些成员,它们可以极大地简化读写文本数据的过程。
表16-5 File类型的方法
方 法 |
作 用 |
ReadAllBytes() |
打开指定文件,以字节数组形式返回二进制数据,然后关闭文件 |
ReadAllLines() |
打开指定文件,以字符串数组形式返回字符数据,然后关闭文件 |
ReadAllText() |
打开指定文件,以System.String形式返回字符数据,然后关闭文件 |
WriteAllBytes() |
打开指定文件,写入字节数组,然后关闭文件 |
WriteAllLines() |
打开指定文件,写入字符串数组,然后关闭文件 |
WriteAllText() |
打开指定文件,写入字符数据,然后关闭文件 |
使用File类型的这些新方法,只用几行代码我们就可以批量读写数据。更好的是,每一个成员都自动关闭基层文件句柄。例如:
class Program
{
static void Main(string[] args)
{
string[] myTasks = {
"Fix bathroom sink",
"Call Dave",
"Call Mom and Dad",
"Play XBox"};
// 向C盘的文件写入所有数据。
File.WriteAllLines(@"C:\tasks.txt", myTasks);
// 重新读取然后输出。
foreach (string task in File.ReadAllLines(@"C:\tasks.txt"))
{
Console.WriteLine("TODO: {0}", task);
}
}
}
很明显,如果你希望快速获取文件句柄的话,使用File类型能节省很多代码。然而使用前面提到的FileInfo对象的好处是能从FileSystemInfo抽象基类定义的成员中获取文件属性:
static void Main(string[] args)
{
// 显示boot.ini的信息,然后以只读形式进行访问。
FileInfo bootFile = new FileInfo(@"C:\boot.ini");
Console.WriteLine(bootFile.CreationTime);
Console.WriteLine(bootFile.LastAccessTime);
FileStream readOnlyStream = bootFile.OpenRead();
readOnlyStream.Close();
}