分析问题
1、FileInfo类型。
FielInfo类型提供了查看状态、创建、复制、删除、移动和打开文件的实例方法,类型的使用方法非常简单,但功能却十分强大。和File类型的区别在于:
(1)FileInfo可以针对某个文件生成具体的实例,而File是静态类。
(2)FileInfo致力于操作文件在文件系统中的结构,而File主要致力于文件本身的读写操作。
FileInfo类型的功能非常强大,以下代码展示了其常用的一些功能。
using System.IO; using System; namespace Test { class UseFileInfo { static void Main() { ProcessFile(); Console.Read(); } //操作文件的功能 static void ProcessFile() { FileInfo info = null; FileInfo newInfo = null; try { //创建文件 info = new FileInfo(@"D:\test1.txt"); using (FileStream fs=info.Create()) { } Console.WriteLine("原始文件:"); ReadFileInfo(info); //移动文件 info.MoveTo(@"D:\test2.txt"); Console.WriteLine("移动后的新文件:"); ReadFileInfo(info); //复制文件 newInfo = info.CopyTo(@"D:\test3.txt"); Console.WriteLine("复制后的新文件:"); ReadFileInfo(newInfo); } finally { //删除文件 if (info!=null) { info.Delete(); } if (newInfo!=null) { newInfo.Delete(); } } } //读取文件状态信息的功能 static void ReadFileInfo(FileInfo fi) { Console.WriteLine("文件名为:{0}",fi.Name); Console.WriteLine("文件在:{0}", fi.DirectoryName); Console.WriteLine("文件的长度:{0}", fi.Length); Console.WriteLine("文件创建于:{0}", fi.CreationTime); Console.WriteLine("文件最后修改时间:{0}", fi.LastWriteTime); Console.WriteLine("文件最后访问时间:{0}", fi.LastAccessTime); Console.WriteLine("文件的全名是:{0}", fi.FullName); Console.WriteLine("文件的扩展名是:{0}", fi.Extension); } } }
如以上代码所示,FileInfo类型对于常用的文件操作提供了非常简单的接口,有几点需要读者注意:
(1)FileInfo本身不实现读写文件的功能,但它提供了针对某文件创建流类型对象或者读写流类型对象的方法,如Create、AppendText、Open、OpenRead、OpenWrite、OpenText等方法。
(2)在使用Create方法时,不要遗忘获取返回的流对象并关闭流。例如下面的代码将非常隐蔽地引入一个危险:info.Create();。
(3)FileInfo不能被继承,事实上该类型已经实现的非常好,基本没有派生的需要。
下面是以上代码的执行结果:
2、DirectoryInfo类型。
和FileInfo非常类似,DirectoryInfo致力于封装文件夹的操作,并且提供简便友好的接口。虽然在操作系统层面上,文件和文件夹本身没有很大的区别,但是站在应用层上,文件和文件夹的操作还是截然不同的,这也是.NET小组区分FileInfo和DirectoryInfo的原因。
以下代码展示了DirectoryInfo的功能。
using System; using System.IO; namespace Test { class UseDirectoryInfo { static void Main() { ProcessDirectory(); Console.Read(); } //操作文件夹功能 static void ProcessDirectory() { DirectoryInfo di = null; try { //创建文件夹 di = new DirectoryInfo(@"D:\Test"); di.Create(); //为文件夹添加子文件夹 di.CreateSubdirectory("subDic"); //为子文件夹添加一个文件 FileInfo info = new FileInfo(@"D:\Test\subDic\text.txt"); using (FileStream fs=info.Create()) { } //读取文件夹信息 ReadDirectoryInfo(di); //移动文件夹 di.MoveTo(@"D:\Test2"); } finally { if (di!=null) { //删除文件夹 //一起删除了子文件夹和其中的文件 di.Delete(true); } } } //读取文件夹信息的功能 static void ReadDirectoryInfo(DirectoryInfo di) { Console.WriteLine("文件夹名称为:{0}",di.Name); Console.WriteLine("父文件夹为:{0}", di.Parent.Name); Console.WriteLine("文件夹创建于:{0}", di.CreationTime); Console.WriteLine("文件夹最后修改时间:{0}", di.LastWriteTime); Console.WriteLine("文件夹最后访问时间:{0}", di.LastAccessTime); Console.WriteLine("文件夹全名是:{0}", di.FullName); Console.WriteLine("文件夹中的文件:"); FileInfo[] fis = di.GetFiles(); foreach (FileInfo fi in fis) { ReadFileInfo(fi); } Console.WriteLine("文件夹中的子文件夹:"); DirectoryInfo[] dis = di.GetDirectories(); foreach (DirectoryInfo sdi in dis) { ReadDirectoryInfo(sdi); } } //读取文件状态信息的功能 static void ReadFileInfo(FileInfo fi) { Console.WriteLine("文件名为:{0}", fi.Name); Console.WriteLine("文件在:{0}", fi.DirectoryName); Console.WriteLine("文件的长度:{0}", fi.Length); Console.WriteLine("文件创建于:{0}", fi.CreationTime); Console.WriteLine("文件最后修改时间:{0}", fi.LastWriteTime); Console.WriteLine("文件最后访问时间:{0}", fi.LastAccessTime); Console.WriteLine("文件的全名是:{0}", fi.FullName); Console.WriteLine("文件的扩展名是:{0}", fi.Extension); } } }
注意
文件夹的删除需要传入一个参数,以告诉Delete方法是否需要同时删除子文件和子文件夹。
DirectoryInfo和FileInfo的使用非常类似,区别在于DirectoryInfo添加了操作文件夹下子文件和文件夹的功能,而没有类似于FileInfo的打开文件等操作。
下面是以上代码的执行结果:
注意
FileInfo和DirectoryInfo的操作涉及资源的争用,并且不能确保文件或者文件夹存在与否,一般所有的操作需要包含在try、catch、finally块内。
答案
.NET内建类型中提供了FileInfo和DirectoryInfo两个类型,分别用来操作文件和文件夹。有别于File和Directory类型,FileInfo和DirectoryInfo主要的功能在于操作文件和文件夹在文件系统中的结构,完成诸如创建、复制、读取信息、移动、判断是否存在、删除等功能。
如何操作文件和文件夹