16.6 使用FileInfo类
从MyDirectoryApp例子中可以看到,FileInfo类能让我们获得硬盘上现有文件的详细信息(创建时间、大小、文件特性等),并帮助我们创建、复制、移动和删除文件。除了从FileSystemInfo继承的一些功能外,表16-4列出了一些FileInfo类独有的核心成员。
表16-4 FileInfo核心成员
|
成 员 |
作 用 |
|
AppendText() |
创建一个StreamWriter类型(后面会讨论),它用来向文件追加文本 |
|
CopyTo() |
将现有文件复制到新文件 |
|
Create() |
创建一个新的文件并且返回一个FileStream类型(后面会讨论),通过它来和新创建的文件进行交互 |
|
CreateText() |
创建一个写入新文本文件的 StreamWriter类型 |
|
Delete() |
删除FileInfo实例绑定的文件 |
|
Directory |
获取父目录的实例 |
|
DirectoryName |
获取父目录的完整路径 |
|
Length |
获取当前文件或目录的大小 |
|
MoveTo() |
将指定文件移到新位置,并提供指定新文件名的选项 |
|
Name |
获取文件名 |
|
Open() |
用各种读/写访问权限和共享特权打开文件 |
|
OpenRead() |
创建只读 FileStream |
|
OpenText() |
创建从现有文本文件中读取数据的StreamReader(后面会讨论) |
|
OpenWrite() |
创建只写FileStream类型 |
有必要知道,大部分FileInfo类的成员返回一个I/O相关的特定对象(FileStream、StreamWriter等),让我们以不同格式从关联文件读或向关联文件写数据。下面会谈到这些类型,不过现在先来研究使用FileInfo类类型来获取一个文件句柄的各种方法。
16.6.1 FileInfo.Create()方法
第一种建立文件句柄的方法是使用FileInfo.Create()方法:
public class Program
{
static void Main(string[] args)
{
// 在C盘新建一个文件。
FileInfo f = new FileInfo(@"C:\Test.dat");
FileStream fs = f.Create();
// 使用FileStream对象。
// 关闭文件流。
fs.Close();
}
}
需要注意的是FileInfo.Create()方法返回一个FileStream类型,FileStream能对基层的文件进行同步/异步的读写操作。需要知道的是,FileInfo.Create()返回的FileStream对象给所有的用户授予完全读写操作权限。
16.6.2 FileInfo.Open()方法
我们能使用FileInfo.Open()方法来打开现有文件,同样也能使用它来创建新文件,它比FileInfo.Create()多了很多细节。一旦调用Open()完成后,它返回一个FileStream对象,请看下面代码:
static void Main(string[] args)
{
...
// 通过FileInfo.Open()创建新文件。
FileInfo f2 = new FileInfo(@"C:\Test2.dat");
FileStream fs2 = f2.Open( FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
// 使用FileStream对象。
// 关闭文件流。
fs2.Close();
}
上面的重载Open()方法需要3个参数。第一个参数指定I/O请求的基本方式(比如说新建文件、打开现有文件和追加文件等),它的值由FileMode枚举指定:
public enum FileMode
{
// 指定操作系统创建新文件。如果文件已存在,则将引发System.IO.IOException异常。
CreateNew,
// 指定操作系统创建新文件。如果文件已存在,它将被改写。
Create,
Open,
// 指定操作系统打开文件(如果文件存在);如果文件不存在则创建新文件。
OpenOrCreate,
Truncate,
Append
}
第二个参数的值由FileAccess枚举定义,用来决定基层流的读写行为:
public enum FileAccess
{
Read,
Write,
ReadWrite
}
最后,第三个参数FileShare指定了文件在其他的文件处理程序中的共享方式,下面是一些主要成员:
public enum FileShare
{
None,
Read,
Write,
ReadWrite
}
16.6.3 FileInfo.OpenRead()和FileInfo.OpenWrite()方法
FileInfo.Open()方法能让我们用非常灵活的方式获取文件句柄,FileInfo类同样提供了OpenRead()和OpenWrite()成员。读者可能也想到了,这些方法不需要提供各种枚举值就能返回一个正确配置的只读或只写的FileStream类型。和FileInfo.Create()、FileInfo.Open()方法一样,FileInfo.OpenRead()和FileInfo.OpenWrite()也都返回一个FileStream对象:
static void Main(string[] args)
{
...
// 得到一个只读的FileStream对象。
FileInfo f3 = new FileInfo(@"C:\Test3.dat");
FileStream readOnlyStream = f3.OpenRead();
// 使用FileStream对象……
readOnlyStream.Close();
// 得到一个只写的FileStream对象。
FileInfo f4 = new FileInfo(@"C:\ Test4.dat");
FileStream writeOnlyStream = f4.OpenWrite();
// 使用FileStream对象……
writeOnlyStream.Close();
}
16.6.4 FileInfo.OpenText()方法
FileInfo类型另外一个“Open”成员是OpenText()。和Create()、Open()、OpenRead()、OpenWrite()方法不同,OpenText()方法返回的是一个StreamReader类型的实例,而不是一个FileStream类型:
static void Main(string[] args)
{
...
// 得到一个StreamReader对象。
FileInfo f5 = new FileInfo(@"C:\boot.ini");
StreamReader sreader = f5.OpenText();
// 使用StreamReader对象……
sreader.Close();
}
马上就会看到,StreamReader类型提供了从基层文件读取字符数据的方法。
16.6.5 FileInfo.CreateText()和FileInfo.AppendText()方法
最后需要指出的两个方法是CreateText()和AppendText(),它们都返回一个StreamWriter,代码如下:
static void Main(string[] args)
{
...
FileInfo f6 = new FileInfo(@"C:\Test5.txt");
StreamWriter swriter = f6.CreateText();
// 使用StreamWriter对象。
swriter.Close();
FileInfo f7 = new FileInfo(@"C:\FinalTest.txt");
StreamWriter swriterAppend = f7.AppendText();
// 使用StreamWriter对象。
swriterAppend.Close();
}
读者可能猜到了,StreamWriter类型提供向基层文件写入字符数据的方法。






