16.3 使用DirectoryInfo类型
我们首先要讨论的用于I/O的类型是DirectoryInfo类。它包含一组用来创建、移动、删除和枚举所有目录/子目录的成员。表16-3列举了除了它的基类(FileSystemInfo)提供的功能外的一些成员。
表16-3 DirectoryInfo类型的主要成员
|
成 员 |
作 用 |
|
Create() CreateSubdirectory() |
按照路径名建立一个目录(或者一组子目录) |
|
Delete() |
删除一个目录和它的所有内容 |
|
GetDirectories() |
返回一个表示当前目录中所有子目录的字符串数组 |
|
GetFiles() |
返回FileInfo类型的数组,表示指定目录下的一组文件 |
|
MoveTo() |
将一个目录及其内容移动到一个新的路径 |
|
Parent |
获取指定路径的父目录 |
|
Root |
获取路径的根部分 |
我们首先指定一个特别的目录路径作为构造函数的参数。如果需要访问当前应用程序目录的话(比如执行的应用程序的目录),可以使用“.”符号。下面是一些例子:
// 绑定到当前的应用程序目录。
DirectoryInfo dir1 = new DirectoryInfo(".");
// 使用verbatim字符串绑定到C:\Windows。
DirectoryInfo dir2 = new DirectoryInfo(@"C:\Windows");
在第二个例子中,必须确保传入构造函数的路径(C:\Windows)是在物理计算机上存在的。然而如果试图使用一个不存在的目录,系统会抛出System.IO.DirectoryNotFoundException异常。因此,如果指定了一个尚未创建的目录的话,在对目录进行操作前首先需要调用Create()方法。
// 绑定到一个不存在的目录,然后创建它。
DirectoryInfo dir3 = new DirectoryInfo(@"C:\Windows\Testing");
dir3.Create();
创建了DirectoryInfo对象后,就能使用任何一个派生自FileSystemInfo的属性来获取基层目录的内容。例如,下面这个类创建了一个新的DirectoryInfo对象并且映射到C:\Windows(如果需要的话,可以调整路径),然后显示许多相关的统计信息(输出结果如图16-2所示):
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Fun with Directory(Info) *****\n");
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
// 打印目录信息。
Console.WriteLine("***** Directory Info *****");
Console.WriteLine("FullName: {0} ", dir.FullName);
Console.WriteLine("Name: {0} ", dir.Name);
Console.WriteLine("Parent: {0} ", dir.Parent);
Console.WriteLine("Creation: {0} ", dir.CreationTime);
Console.WriteLine("Attributes: {0} ", dir.Attributes);
Console.WriteLine("Root: {0} ", dir.Root);
Console.WriteLine("**************************\n");
}
}

图16-2 Windows目录的信息
16.3.1 FileAttributes枚举
FileSystemInfo的Attributes属性指示了当前目录或文件的各种特性,它们都由FileAttributes枚举类表示。其实这个名字本身就描述了它的意思,这里列出了一些相对比较难理解的枚举(参考.NET Framework 2.0 SDK文档获知所有细节):
public enum FileAttributes
{
ReadOnly,
Hidden,
// 文件是操作系统的一部分或由操作系统以独占方式使用。
System,
Directory,
Archive,
// 保留供将来使用。
Device,
// 文件正常,没有设置其他的特性。
Normal,
Temporary,
// 稀疏文件通常是数据多为零的大文件。
SparseFile,
// 一个与文件或目录相关联的由用户定义的数据块。
ReparsePoint,
Compressed,
Offline,
// 操作系统的内容索引服务不会创建此类型文件的索引。
NotContentIndexed,
Encrypted
}
16.3.2 使用DirectoryInfo类型列出文件
除了获取已存在目录的基本信息外,我们还能使用DirectoryInfo类型的一些方法来扩展当前的例子。首先,使用GetFiles()方法来获取C:\Windows目录下的所有*.bmp文件。这个方法返回FileInfo类型的数组,每个FileInfo类型都包含了一个文件的细节(有关FileInfo类型的详细内容在本章的后面进行讨论)。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Fun with Directory(Info) *****\n");
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
...
// 获取所有.bmp扩展名的文件。
FileInfo[] bitmapFiles = dir.GetFiles("*.bmp");
// 我们找到多少文件?
Console.WriteLine("Found {0} *.bmp files\n", bitmapFiles.Length);
// 输出每个文件的信息。
foreach (FileInfo f in bitmapFiles)
{
Console.WriteLine("***************************\n");
Console.WriteLine("File name: {0} ", f.Name);
Console.WriteLine("File size: {0} ", f.Length);
Console.WriteLine("Creation: {0} ", f.CreationTime);
Console.WriteLine("Attributes: {0} ", f.Attributes);
Console.WriteLine("***************************\n");
}
}
}
运行程序后会发现程序的结果和图16-3类似(读者的这些位图文件可能会不同)。
16.3.3 使用DirectoryInfo类型创建子目录
我们能使用DirectoryInfo.CreateSubdirectory()方法以编程方式扩展目录结构。使用这个方法可以建立一个子目录,也可以一次建立多个嵌套子目录。例如,下面这段代码通过建立一些自定义子目录来扩展C:\Windows的目录结构:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Fun with Directory(Info) *****\n");
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
...
// 在初始目录下创建\MyFoo。
dir.CreateSubdirectory("MyFoo");
// 在初始目录下创建\MyBar\MyQaaz。
dir.CreateSubdirectory(@"MyBar\MyQaaz");
}
}
如果使用Windows Explorer(Windows资源管理器)来检查Windows目录,会发现这些子目录已被成功创建(如图16-4所示)。
尽管不一定要去捕获CreateSubdirectory()方法的返回值,但是需要知道的是,如果执行成功,它会返回表示新建项的DirectoryInfo类型。
// CreateSubdirectory()返回了一个表示新建项的DirectoryInfo类型。
DirectoryInfo d = dir.CreateSubdirectory("MyFoo");
Console.WriteLine("Created: {0} ", d.FullName);
d = dir. CreateSubdirectory(@"MyBar\MyQaaz");
Console.WriteLine("Created: {0} ", d.FullName);

图16-4 创建子目录






