《C#入门到精通》学习笔记 -- FileInfo类

P84: FileInfo类

FileInfo类是一个密封类,它可以用来创建、复制、删除、移动和打开文件的实例方法。FileInfo类包括6个属性,可以用来获取文件的名称、完整路径等
  • Directory                    获取父目录
  • Exists                         指定当前文件是否存在
  • DirectoryName           获取文件的完整路径
  • Length                       获取当前文件的大小(字节)
  • IsReadOnly                获取或设置当前文件是否为只读
  • Name                         获取文件的名称

FileInfo和DirectoryInfo类一样,也包括了FileSystemInfo类继承而来的属性。FileInfo类还包括实例方法:

  • Create()                     创建文件
  • OpenRead()               以只读方式打开文件
  • Delete()                      删除指定文件
  • OpenWrite()                以只写方式打开文件
  • MoveTo()                    将指定文件移到新位置
  • CreateText()               创建写入新文本文件的StreamWriter
  • CopyTo()                    将现有文件复制到新文件
  • OpenText()                 打开指定文本文件,并准备从其文件中读取内容
  • Replace()                   使用其他文件的内容替换指定文件的内容
  • AppendText()             创建一个StreamWriter,它可以想文本文件追加内容
【示例1】 使用FileInfo类的Create()方法创建一个名称为"my.ini"的文件。
   1. FileInfo fi = new FileInfo("my.ini");  
   2. fi.Create(); 

分析:该示例首先创建FileInfo类的实例fi,它被指定为my.ini文件,然后调用Create()方法创建该文件。新创建的my.ini文件保存在应用程序所在的目录

写入文件
存在多种方法,可以将指定内容写入到文件,如File类的OpenWrite()方法、FileInfo类的OpenWrite()方法等。

【示例2】 使用FileInfo类的OpenWrite()方法将"这是一个配置文件。"字符串写入到名称为my.ini的文件中,具体步骤如下:

(1)创建FileInfo类的实例fi,它被指定为my.ini文件。
(2)使用OpenWrite()方法打开my.ini文件,并保存为FileStream类的实例fsw。
(3)设置被写入的内容("这是一个配置文件。"字符串),并转换为byte数组,保存为dataw。
(4)调用fsw实例的Write()方法将dataw数组中的内容写入到my.ini文件。
(5)调用fsw实例的Close()方法关闭fsw实例。

   1. FileInfo fi = new FileInfo("my.ini");     
   2. ///创建FileInfo类的实例fi  
   3. FileStream fsw = fi.OpenWrite();          
   4. ///使用OpenWrite()方法打开my.ini文件  
   5. string valuew = "这是一个配置文件。";          
   6. ///设置被写入的内容  
   7. byte[] dataw = System.Text.Encoding.Unicode.GetBytes(valuew);  
   8. ///转换为byte数组,保存为dataw  
   9. fsw.Write(dataw,0,dataw.Length);      
  10. ///将dataw数组中的内容写入到my.ini文件  
  11. fsw.Close();                              
  12. ///调用fsw实例的Close()方法关闭fsw实例 

分析:上述示例代码运行之后,将"这是一个配置文件。"字符串写入到名称为my.ini的文件中。以记事本的方式查看my.ini文件的内容. 
主要:my.ini文件的内容已经被使用Unicode方式编码过,所以不能看到该文件的真实内容


 读取文件
存在多种方法,可以从指定文件中读取内容,如File类的OpenRead()方法、FileInfo类的OpenRead()方法等。

【示例3】 使用FileInfo类的OpenRead()方法从my.ini文件读取内容,并转换为一个字符串(保存为valuer),最终,将valuer的内容显示在控制台。具体步骤如下:

(1)创建FileInfo类的实例fi,它被指定为my.ini文件。
(2)使用OpenRead()方法打开my.ini文件,并保存为FileStream类的实例fsr。
(3)创建datar数组,用来保存从my.ini文件读取的内容。
(4)调用fsw实例的Read()方法读取my.ini文件的内容,并保存到datar数组。
(5)将datar数组转换为一个字符串,并保存为valuer。
(6)显示valuer的值。
(7)调用fsw实例的Close()方法关闭fsw实例。

   1. FileInfo fi = new FileInfo("my.ini");     
   2. ///创建FileInfo类的实例fi  
   3. FileStream fsr = fi.OpenRead();           
   4. ///使用OpenRead()方法打开my.ini文件  
   5. byte[] datar = new byte[(int)fsr.Length];  
   6. ///创建datar数组,保存从my.ini文件读取的内容  
   7. fsr.Read(datar,0,(int)fsr.Length);    
   8. ///读取my.ini文件的内容,保存到datar数组  
   9. string valuer = System.Text.Encoding.Unicode.GetString(datar);  
  10. ///将datar数组转换为string,保存为valuer  
  11. Console.WriteLine(valuer);                
  12. ///显示my.ini文件的内容  
  13. fsr.Close();                              
  14. ///调用fsw实例的Close()方法关闭fsw实例 

分析:上述示例代码运行之后,将显示"这是一个配置文件。"字符串。

移动文件
移动文件可以使用以下2种方法中的任何一种。
File类的Move()方法:将指定文件移到新位置。


【示例4】 使用File类的Move()方法将my.ini文件移动为my01.ini文件。
   1. File.Move(@"my.ini","my01.ini"); 

分析:上述代码执行之后,实际上是创建了名称为my01.ini的新文件,并删除了my.ini文件。
FileInfo类的MoveTo()方法:将指定文件移到新位置。

【示例5】 创建FileInfo类的实例fi(表示"my.ini"文件),并调用MoveTo()方法将my.ini文件移动为my01.ini文件。

   1. FileInfo fi = new FileInfo("my.ini");  
   2. fi.MoveTo("my01.ini"); 

分析:上述代码执行之后,实际上是创建了名称为my01.ini的新文件,并删除了my.ini文件。

 删除文件
删除文件可以使用以下2种方法中的任何一种。

File类的Delete()方法:将删除指定的文件。
【示例6】 使用File类的Delete()方法删除my.ini文件。
   1. File.Delete(@"my.ini","my01.ini"); 
FileInfo类的Delete()方法:将删除指定的文件。

【示例7】 创建FileInfo类的实例fi(表示my.ini文件),并调用Delete()方法删除my.ini文件。
   1. FileInfo fi = new FileInfo("my.ini");  
   2. fi.Delete("my.ini"); 

实例:读取目录下指定类型的文件的内容
【实例8】 实现了读取指定目录下的、指定文件类型的、所有文件的内容,并在控制台中显示读取的内容。具体实现步骤如下:
(1)打开Visual Studio 2008集成开发环境,并创建名称为"Sample_21"的控制台应用程序。该应用程序的版本为.NET Framework 3.5。
(2)右击"解决资源方案管理器"面板中的Program.cs节点,打开名称为"Program.cs"的类文件,并在该文件中添加 ReaderFile (string path) 方法的程序代码。ReaderFile (string path)方法读取指定文件(由path参数指定)的内容,并返回读取的内容。具体步骤如下:
① 创建类型为string的fileData变量,用来保存读取的内容。
② 在try语句中读取文件的内容。
③ 创建读取文件内容的StreamReader类的实例reader,并指定该实例的编码方式为操作系统的默认编码方式。
④ 调用ReadToEnd()方法从头至尾读取文件的所有内容,并保存为fileData变量。
⑤ 关闭reader实例。
⑥ 如果try语句发生异常,则在catch语句中抛出异常。

综合上述,ReaderFile(string path)方法的程序代码如下。

   1. /// <summary> 读取文件的内容 </summary>  
   2. public static string ReaderFile(string path)  
   3. {  
   4.     string fileData = string.Empty;  
   5.     try 
   6.     {   ///读取文件的内容  
   7.         StreamReader reader = new   
   8.         StreamReader(path,Encoding.Default);  
   9.         fileData = reader.ReadToEnd();  
  10.         reader.Close();  
  11.     }  
  12.     catch(ExceptI/On ex){throw new ExceptI  
  13.     /On(ex.Message,ex);}  ///抛出异常  
  14.     return fileData;  
  15. } 

(3)在Program.cs文件中添加ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法的程序代码。该方法读取指定目录(由path参数指定)下的、满足过滤器(filter参数指定)的所有文件的内容,读取的内容都保存到content参数(该参数为引用参数)中。具体步骤如下:

① 判断path参数是否合法。如果不合法,则中止该方法。
② 创建目录信息的实例parentDi。
③ 使用foreach语句和GetFiles()方法搜索parentDi实例指定目录下的、满足过滤器(filter参数指定)的所有文件。
④ 如果foreach语句找到文件,则依次读取每一个文件的内容,并保存到content参数中。
综合上述,ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法的程序代码如下:
   1. /// <summary> 读取子目录下的所有文件的内容 </summary>  
   2. private static void ReaderSubDirectory(string path,string filter,ref  StringBuilder content)  
   4. {   ///判断目录是否正确  
   5.     if(string.IsNullOrEmpty(path) == true) return;  
   6.     ///创建目录信息的实例  
   7.     DirectoryInfo parentDI = new DirectoryInfo(path);  
   8.     ///读取当前目录及其子目录下的指定文件的内容,  
   9.     都保存到content变量中  
  10.     foreach(FileInfo fi in parentDI.  
  11.     GetFiles(filter,SearchOptI/On.AllDirectories))  
  12.     {  
  13.         content.AppendLine();  
  14.         content.Append(ReaderFile(fi.FullName));  
  15.         content.AppendLine();  
  16.     }  
  17. } 

(4)在Program.cs文件中添加ReaderDirectory(string path,string filter)方法的程序代码。该方法读取指定目录(由path参数指定)下的、满足过滤器(filter参数指定)的所有文件的内容,并返回读取的内容。具体步骤如下:
① 判断path参数是否合法。如果不合法,则中止该方法。
② 创建保存读取的内容的StringBuilder类的实例content。
③ 如果filter参数为空,则直接调用ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法读取path参数指定目录(及其子目录)下的所有文件的内容。
④ 如果filter参数不为空,则首先将过滤器转换为一个字符串数组filters,然后使用foreach语句处理filters数组中每一个类型的文件,并读取path目录(及其子目录)下的、满足过滤器的所有文件的内容。
⑤ 上述读取文件的内容,都保存在content变量中。最后,将该变量转换为一个字符串,并返回该字符串。
综合上述,ReaderDirectory(string path,string filter)方法的程序代码如下:
   1. /// <summary> 读取指定目录下的所有文件 </summary>  
   2. public static string ReaderDirectory(string path,string filter)  
   3. {   ///判断目录是否正确  
   4.     if(string.IsNullOrEmpty(path) == true) return string.Empty;  
   5.     StringBuilder content = new StringBuilder();              
   6.     ///保存读取的内容  
   7.     ///如果过滤器(filter)为空,则默认读取所有文件的内容  
   8.     if(string.IsNullOrEmpty(filter) == true)  
   9.     {  
  10.         ReaderSubDirectory(path,filter,ref content);  
  11.     }  
  12.     else 
  13.     {   ///如果过滤器(filter)不为空,则获取被读取的文件  
  14.     string[] filters = filter.Split(new char[] { '|' },  
  15.     StringSplitOptI/Ons.RemoveEmptyEntries);  
  16.         ///读取每一个文件的内容  
  17. foreach(string fi in filters){ReaderSubDirectory(path,fi,ref   
  18.         content);}  
  19.     }  
  20.     return content.ToString();  
  21. } 

(5)在Program.cs文件的Main(string[] args)方法中调用ReaderDirectory(string path,string filter)方法读取"C:\data"目录下的、后缀名为.cs的所有文件的内容,并显示在控制台中。程序代码如下:
   1. static void Main(string[] args)  
   2. {   ///读取"C:\data"目录下的所有的以",cs"结尾文件的内容,  
   3. 并显示  
   4.     Console.WriteLine(ReaderDirectory(@"C:\data","*.cs"));  
   5.     Console.Read();  
   6. } 

(6)在Visual Studio 2008集成开发环境按下F5键,运行Sample_21应用程序。控制台显示的部分结果如下:
   1. using System;  
   2. using System.CollectI/Ons;  
   3. using System.Text;  
   4. using System.I/O;  
   5. using System.Windows.Forms;  
   6.  
   7. namespace Dorient.FileParse.Component  
   8. {  
   9.         public class File  
  10.         {  
  11. …  
  12.  ///写入文件  
  13. StreamWriter writer = new StreamWriter(path,false,  
  14. Encoding.Default);  
  15. writer.Write(content);  
  16. writer.Close();  
  17.                         }  
  18.                         catch(ExceptI/On ex)  
  19.                         {  
  20. MessageBox.Show(ex.Message,"写入文件错误");  
  21.                         }  
  22.                 }  
  23.         }  
  24. } 

问题:如何遍历一个目录下的所有目录(不包括子目录)和文件,并显示目录和文件的名称?
解答:直接使用foreach语句和Directory类中的方法即可,程序代码如下。
   1. string path = …///被遍历的目录  
   2. DirectoryInfo parentdi = new DirectoryInfo(path);   
   3. ///创建path所指定目录的实例  
   4. foreach(DirectoryInfo di in parentdi.GetDirectories())   
   5. ///访问当前目录的子目录  
   6. {  
   7.     Console.WriteLine(di.Name);                              
   8.     ///显示子目录的名称  
   9. }  
  10. foreach(FileInfo fi in parentdi.GetFiles())   
  11. ///访问当前目录的文件  
  12. {  
  13.     Console.WriteLine(fi.Name);                   
  14.     ///显示文件的名称  
  15. } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值