首页 > 代码库 > 如何操作文件和文件夹

如何操作文件和文件夹

分析问题

  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主要的功能在于操作文件和文件夹在文件系统中的结构,完成诸如创建、复制、读取信息、移动、判断是否存在、删除等功能。