.NET中文件与文件夹的操作
本文节选自《21天学通C#》一书
在.NET Framework类库中,提供了DirectoryInfo类,用于对文件夹进行操作,移动和删除文件夹可以使用它提供的MoveTo()和Delete()方法来完成。.NET Framework类库还提供了File类,用于对文件的操作。它和Directory类一样,也有两个方法可以用于文件的移动和删除,它们是Move()和Delete()方法。在本节中,将介绍文件和文件夹的移动、复制和删除。
使用File类的Move()方法,可以将指定的文件移动到新的位置,并且可以重新为它命名。它有两个参数。第一个参数就是要移动的文件路径和名称,第二个参数是文件的新路径。例如:
01 File.Move(“C://hoan.txt”,”D://hoan.txt”);
使用File类的Copy()方法,可以将指定的文件复制到新的位置。它也有两个参数,第一个参数就是要移动的文件的路径和名称,第二个参数是文件的新路径。例如:
01 File.Copy(“C://hoan.txt”,”D://hoan.txt”);
注意:Copy()方法的第二个参数不能是一个已经存在的目录或文件,否则在程序运行时将会有异常。另外,在进行程序设计时,这个部分代码最好包含在try块中。
使用File类的Delete()方法,可以将文件删除。它有一个参数,表示要删除的文件路径。此路径可以是相对路径,也可以是绝对路径。例如:
File.Delete(“D://hoan.txt”);
【范例19-2】在本例中,演示如何使用Directory类和DirectoryInfo类创建、移动和删除文件夹。如示例代码19-2所示。
示例代码19-2
用CreateDirectory()方法创建文件夹,代码如下:
01 try //可能会引发异常
02 {
03 if (Directory.Exists(textBox1.Text)) //判文件夹是否存在
04 {
05 label1.Text = "该文件夹已经存在"; //提示信息
06 return;
07 }
08 else //如果文件夹不存在
09 {
10 DirectoryInfo dirinfo = System.IO.Directory.CreateDirectory(textBox1. Text); //创建文件夹
11 label1.Text ="创成功,创建时间为:"+ Directory.GetCreationTime(textBox1. Text);
12 }
13 }
14 catch (Exception ee) //捕获异常
15 {
16 label1.Text = "创建失败!原因:" + ee.ToString();
//提示信息
17 }
用Delete()方法删除文件夹,代码如下:
18 try
19 {
20 if (!Directory.Exists(textBox1.Text)) //判断文件夹是否存在
21 {
22 label1Text = "该文件夹不存在"; //提示信息
23 }
24 else
25 {
26 Directory.Delete(textBox1.Text); //删除文件夹
27 label1.Text = "删除文件夹成功!"; //提示信息
28 }
29 }
30 catch (Exception ee) //捕获异常
31 {
32 label1.Text = "删除失败!原因:" + ee.ToString();
33 }
用Move()方法移动文件夹,代码如下:
34 try
35 {
36 if (!Directory.Exists(textBox1.Text)) //判断源文件夹是否存在
37 {
38 label1.Text = "源文件夹不存在!"; //提示信息
39 return;
40 }
41 if (Directory.Exists(textBox2.Text)) //判断目标文件夹是否存在
42 {
43 label1.Text = "目标文件夹已经存在!"; //输出提示信息
44 return;
45 }
46 Directory.Move(textBox1.Text, textBox2.Text);//移动文件夹
47 label1.Text = "文件夹移动成功!源文件已经被移除。目标文件夹为" + textBox1.Text;
48 }
49 catch (Exception ee) //捕获异常
50 {
51 label1.Text = "移动失败!原因:" + ee.ToString();
52 }
【运行结果】选择“调试”|“启动调试”命令运行程序,结果如图19.2所示。
图19.2 文件夹创建成功
【代码解析】在第3行中,用Directory类的Exists()方法来判断文件夹是否存在。在Exists()方法中,一般传递进来的参数就是文件夹的名称或者路径。在对文件夹进行操作前,判断它是否存在,可以减少异常的发生。在第10行代码中,用CreateDirectory()方法创建文件夹。第26行和46行分别是删除和移动文件夹。
另外,FileInfo类可用来获取文件的基本信息,如创建时间、文件大小等。如要获取一个文件的基本信息,首先需实例化一个FileInfo类的对象来映射该文件。例如:
01 FileInfo aFile= new FileInfo("C://hoan.txt"); //实例化一个对象
02 aFile.CreationTime; //获取创建时间
03 aFile.Extension; //获取扩展名
04 aFile.Length; //获取大小
19.1.3 读取文件
在.NET Framework类库中,对文件的读取也很简单。用StreamReader类和FileStream类就能办到,它们常用来对文件进行读写操作。它们提供ReadAllText()、ReadAllLines()和ReadAllBytes()方法读取文件。
提示:几乎任何应用编程都会涉及I/O操作,读者务必掌握。
【范例19-3】在本例中演示如何使用StreamReader类读取文件,将编写一个能打开.txt文件的小应用程序。这里打开的.txt文件是简体中文文本。如示例代码19-3所示。
示例代码19-3
01 using System; //统命名空间,包含基本类和基类
02 ……
03 using System.IO; //包含文件操作的命名空间
04 using System.Collections; //命名空间包含接口和类,各种数据结构的集合
05 namespace Ex_19_3
06 {
07 public partial class Form1 : Form //窗体类
08 {
09 public Form1() //构造函数
10 {
11 InitializeComponent(); //完成初始化工作
12 }
13 private void button1_Click(object sender, EventArgs e)
14 {
15 //注意UnicodeEncoding.GetEncoding("GB2312")是保证输出的中文文本能正常显示
16 StreamReader objReader = new StreamReader("test.txt", UnicodeEncoding. GetEncoding("GB2312"));
17 string sLine = ""; //定义一个变量,并赋空值
18 ArrayList arrText = new ArrayList();
//创建一个动态数组
19 while (sLine != null)
20 {
21 sLine = objReader.ReadLine();
//读出文件,并赋给变量sLine
22 if (sLine != null) //如果有数据读出
23 arrText.Add(sLine); //添加到数组中,它的长度可以动态地改变
24 }
25 objReader.Close(); //关闭StreamReader对象
26 foreach (string sOutput in arrText)
//使用foreach循环将新填充的ArrayList内容写入
27 textBox1.Text = sOutput; //将文本的内容赋给文本框
28 }
29 }
30 }
【运行结果】选择“调试”|“启动调试”命令运行程序。
【代码解析】本例中,第16行处的UnicodeEncoding.GetEncoding("GB2312")语句作用是保证打开的txt文档不是乱码,它将以GB2312的编码格式输出。如果没有这一处理,那么输出的内容中,中文部分将会是乱码。
19.1.4 写入文件
使用.NET类库进行读取文件非常简单,同样地,写入文样也一样简单。两种操作都有现存的类可以直接调用。基类库提供WriteAllText()、WriteAllBytes()和WriteAllLines()方法,使用它们可以写入文件。
注意:WriteAllText()、WriteAllBytes()和WriteAllLines()方法都会覆盖以前的文件,所以在使用这些方法时要小心。在下面的示例中,两次写入的数据都会相互覆盖掉。这样的情况,在实际开发中,很少需要,当然也有一些功能是需要覆盖原始数据的。例如计数器的内容,它本来就是一个不断更新的数据值,所以会将新计算的数覆盖原始数据。
【范例19-4】为了说明在C#中WriteAllText()方法如何写入文件。创建一个Windows窗体应用程序,将窗体上的多行文本框中的数据输入.txt文件。同时,也演示如何利用WriteAllLines()方法写入字符串数组。如示例代码19-4所示。
示例代码19-4
01 using System.IO; //包含文件操作的命名空间
02 namespace Ex_19_4
03 {
04 public partial class Form1 : Form
05 {
06 public Form1() //窗口类的构造函数
07 {
08 InitializeComponent(); //完成初始化工作
09 }
10 private void button1_Click(object sender, EventArgs e)
//按钮单击事件,用于写入文件
11 {
12 File.WriteAllText("demo.txt", textBox1.Text);
//向文本文件中写入
13 }
14 private void button2_Click(object sender, EventArgs e)
15 {
16 string[] movies ={"欢迎你", "21天学会C#"};
//定义一个字符串数组
17 File.WriteAllLines("demo.txt", movies);
//写入到文本文件中
18 }
19 }
20 }
【运行结果】选择“调试”|“启动调试”命令运行程序。
【代码解析】在本例中,程序非常简单。在第12行处,是从文本中获取数据,然后写入demo.txt文件中,这个文件和程序在同一目录中。第17行是将16行定义的字符串数组写入文件中,请注意观察两个元素之间是如何换行的。
注意:要将textBox控件设置成多行文本框,请先将它的Multiline属性设置为true。如果数据行数据过多,还要设置让它显示滚动条。