1、面向对象程序设计 (Visual C# .NET),云南省旅游职业学院 信息技术系 王 元 安 2012年4月,第7章 目录与文件管理,7.1 系统环境相关类 7.2 目录管理 7.3 文件管理 7.4 文件的读写 7.5 FileSystemWatcher组件,7.1 系统环境相关类,.NET框架下,与操作系统环境相关的类有两个。1. Environment类该类除了提供当前环境和操作系统平台相关的信息外,还提供了获取本地逻辑驱动器和特殊文件夹的方法。 2. DriveInfo类提供了本地驱动器相关的详细信息。,7.1.1 Environment类,提供有关当前环境和平台的信息以及操作它们
2、的方法。无法继承此类。 命名空间: System 程序集: mscorlib(在 mscorlib.dll 中) 1.常用的属性和方法CurrentDirectory属性 OSVersion属性NewLine属性Version属性 GetLogicalDrives方法 GetFolderPath方法,Environment 成员属性,Environment 成员方法,Environment 类应用举例,项目演示:EnvironmentSample内容:演示Environment类属性与方法的使用,7.1.2 DriveInfo类,使用DriveInfo可以确定当前可用的驱动器以及这些驱动器的类
3、型,还可以通过查询来确定驱动器的容量和剩余空间。,项目演示:DriveInfoSample内容:演示DriveInfo类属性与方法的使用,7.2 目录管理,在System.IO命名空间中,.NET框架提供了3种对目录进行管理的类,分别是Directory类、DirectoryInfo类和Path类。7.2.1 Directory类和DirectoryInfo类 区别:Directory类(只提供静态方法)只用一次DirectoryInfo类(需要实例化才能使用)多次使用 DirectoryInfo类的构造函数形式如下:public DirectoryInfo( string path);参数p
4、ath表示目录所在的路径。例如:DirectoryInfo dirInfo = new DirectoryInfo(“e:temp“); 注意:(1)path是合法的路径。(2)用System.Environment.SpecialFolder下的枚举可以获取特殊文件夹路径。,目录管理属性与方法,2.DirectoryInfo类的主要属性 Exists FullName Parent CreationTime 3.Directory类提供的静态方法 CreateDirectory Delete Move Exists GetCurrentDirectory,将 DirectoryInfo 类用
5、于典型操作,如复制、移动、重命名、创建和删除目录。 如果打算多次重用某个对象,可考虑使用 DirectoryInfo 的实例方法,而不是 Directory 类的相应静态方法,因为并不总是需要安全检查。,DirectoryInfo 成员,11,12,13,Directory 静态方法,7.2.2 Path类,1. Path类用于对包含文件或目录路径信息的String实例执行操作。 2. 常用方法:GetDirectoryName方法 GetExtension方法 GetFileName方法 GetFileNameWithoutExtension方法 GetFullPath方法,15,对包含文件
6、或目录路径信息的 String 实例执行操作。这些操作是以跨平台的方式执行的。 Path 类型公开了以下成员。,Path类方法,16,Path类字段,17,下面的代码示例演示 Path 类的某些主要成员。,using System; using System.IO;class Test public static void Main() string path1 = “c:tempMyTest.txt“;string path2 = “c:tempMyTest“;string path3 = “temp“;if (Path.HasExtension(path1) Console.WriteLi
7、ne(“0 has an extension.“, path1);if (!Path.HasExtension(path2) Console.WriteLine(“0 has no extension.“, path2);if (!Path.IsPathRooted(path3) Console.WriteLine(“The string 0 contains no root information.“, path3);Console.WriteLine(“The full path of 0 is 1.“, path3, Path.GetFullPath(path3);Console.Wri
8、teLine(“0 is the location for temporary files.“, Path.GetTempPath();Console.WriteLine(“0 is a file available for use.“, Path.GetTempFileName(); ,7.2.3 目录的创建、删除和移动,1.创建目录 Directory类的CreateDirectory方法用于创建指定路径中的所有目录。 public static DirectoryInfo CreateDirectory (string path)其中参数path为要创建的目录路径。 举例: Direct
9、ory.CreateDirectory(“c:test“); Directory.CreateDirectory(“c:testt1t2“);,7.2.3 目录的创建、删除和移动,2.删除目录 Directory类的Delete方法用于删除指定的目录,常用的方法原型为 public static void Delete(string path, bool recursive) 其中:path参数不区分大小写,可以是相对于当前工作目录的相对路径,也可以是绝对路径。recursive是一个布尔值,如果要移除path中的目录(包括所有子目录和文件),则为true;否则为false。,7.2.3 目录
10、的创建、删除和移动,3.移动目录 Directory类的Move方法能够重命名或移动目录。方法原型为 public static void Move (string sourceDirName, string destDirName) 其中,sourceDirName为要移动的文件或目录的路径;destDirName为新位置的目标路径。 注意: destDirName参数指定的目标路径应为新目录。,DirectoryInfo项目演示1,21,项目演示:DirectoryInfoSample1内容:演示了 DirectoryInfo 类的某些主要成员。,DirectoryInfo与Directo
11、ry类的使用项目演示2,22,项目演示:CopyDirFormSample 内容:示例演示Directory和DirectoryInfo类的使用方法 ,如何复制目录及其内容。,23,Path类的使用项目演示2,项目演示:PathSample内容:示例演示Path类的使用方法 ,如何复制目录及其内容。,7.2.4 FolderBrowserDialog对话框,FolderBrowserDialog对话框以树形控件的形式将指定路径的文件夹及其子文件夹显示出来,供用户浏览、创建或选择。调用FolderBrowserDialog的ShowDialog方法,可以打开对话框,如果用户在对话框中单击【确定】
12、按钮,则对话框返回结果为DialogResult.OK,否则为DialogResult.Cancel。,7.2.4 FolderBrowserDialog控件,作用:提示用户选择文件夹。无法继承此类。 命名空间: System.Windows.Forms 程序集:System.Windows.Forms(在 System.Windows.Forms.dll 中)FolderBrowserDialog控件的主要属性 :,26,FolderBrowserDialog控件的使用项目演示,项目演示:FolderBrowserDialogSample FolderBrowserDialogSample
13、2 内容:下面的代码示例创建一个应用程序,用户使用该应用程序可以打开 RichTextBox 控件中的多格式文本 (.rtf) 文件。,7.3 文件管理,System.IO命名空间中文件操作类: (1)File (2)FileInfo相同点:都能完成对文件的复制、移动、重命名、创建、打开、删除和追加到文件操作。不同点:FileInfo类提供实例化后的属性、方法File 只提供静态方法用法与Directory和DirectoryInfo相似。,28,File 类属性与方法,提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。 命名空间: System.IO
14、 程序集: mscorlib(在 mscorlib.dll 中),下表描述了用于自定义各种 File 方法的行为的枚举。,29,30,31,32,33,7.3.1 文件复制、删除与移动,File类(1)判断文件是否存在调用File类的Exist方法可以判断是否存在指定的文件。(2)复制文件Copy (sourceFileName, destFileName,bool overwrite)(2) 删除文件Delete (string path)(3) 移动文件Move (sourceFileName, destFileName)注意:Move方法不提供创建目录的功能,要确保存在目标文件目录。,7
15、.3.2 文件属性,1.设置或获取属性(1) 对File类:用SetAttributes方法,GetAttributes方法设置、获取。(2) 对FileInfo类:用Attributes属性设置、获取。(3)注意:FileAttributes的每个枚举值代表目录或者文件的一个属性,各个枚举值是按照2的幂排列的,即依次为20,21,22, 23 , 2.可以利用“与”、“或”操作设置或获取单个属性。,7.3.2 文件属性与设置(续),2.判断某个路径是目录还是文件 下面的代码演示了如何判断某个路径是目录还是文件: if (File.GetAttributes(path) ,7.3.4 Open
16、FileDialog控件和SaveFileDialog,1. 功能:用于显示用户打开文件的对话框。 2. 常用属性:,3. 常用方法:ShowDialog(),7.3.4 OpenFileDialog控件和SaveFileDialog,1.SaveFileDialog用于显示保存文件对话框,提示用户选择文件的保存位置。 2.调用SaveFileDialog的ShowDialog方法,将打开【另存为】对话框,如果用户在对话框中单击【保存】按钮,则保存该文件,并返回DialogResult.OK,否则返回DialogResult.Cancel。,【例7-1】利用FolderBrowerDialog
17、、OpenFileDialog和SaveFileDialog对话框,设计一个Windows应用程序,实现将文件从一个目录复制到另一个目录的功能。,对话框控件综合举例,40,private void buttonFileBrower_Click(object sender, EventArgs e)OpenFileDialog ofd = new OpenFileDialog();string sfn=Application.StartupPath+“;ofd.InitialDirectory = sfn;/ “d:1234567“;if (ofd.ShowDialog() = DialogRe
18、sult.OK)textBoxSourcePath.Text = ofd.FileName;private void buttonDirBrower_Click(object sender, EventArgs e)FolderBrowserDialog fbd = new FolderBrowserDialog();if (fbd.ShowDialog() = DialogResult.OK)textBoxTargetDir.Text = fbd.SelectedPath;,7.4 文件的读写,在System.IO命名空间中,提供了多种类用于进行数据文件和数据流的读写操作。主要有:1. 文件
19、编码,提供了多种编码。2. 文本文件的读写。3. 二进制文件的读写。,7.4.1 文件的编码,1.文件编码 常见的文件编码方式有ASCII编码、Unicode编码、UTF8编码和ANSI编码。 2.在System.Text命名空间中,有一个Encoding类,用于表示字符编码。对文件进行操作时,常用的编码方式有 Encoding.Default 表示操作系统的当前ANSI编码 Encoding.Unicode Unicode编码 Encoding.UTF8 UTF8编码,7.4.2 文本文件的读写,File类提供了非常方便的读写文本文件的方法。 1ReadAllText方法和AppendAll
20、Text方法ReadAllText方法打开一个文件,读取文件的每一行,将每一行添加为字符串的一个元素。然后关闭文件。常用原型为public static string ReadAllText(string path, Encoding encoding) AppendAllText方法用于将指定的字符串追加到文件中,如果文件不存在则自动创建该文件,常用原型为public static void AppendAllText(string path, string contents, Encoding encoding),7.4.2 文本文件的读写,2、ReadAllLines方法和WriteAl
21、lLines方法 ReadAllLines方法打开一个文本文件,将文件的所有行都读入一个字符串数组,然后关闭该文件。 WriteAllLines方法创建一个新文件,在其中写入指定的字符串数组,然后关闭文件。如果目标文件已存在,则覆盖该文件 3StreamReader类和StreamWriter类 流是字节序列的抽象概念。流也是进行数据读取操作的基本对象,流提供了连续的字节流存储空间。 流有如下几种操作。 读取:从流中读取数据到变量中。 写入:把变量中的数据写入到流中。 定位:重新设置流的当前位置,以便随机读写。,7.4.2 文本文件的读写,StreamReader类提供了利用流来按行读取文本文
22、件信息的方法。如果不指定编码,StreamReader的默认编码为UTF-8,而不是当前系统的ANSI编码。 StreamWriter类提供了按行写入文本信息的方法。与StreamReader类似,如果不指定编码,StreamWriter默认使用UTF-8编码,而不是当前系统的ANSI编码。 File类的Open方法先创建一个FileStream对象,然后使用FileStream对象对文件进行读取、写入、打开和关闭操作。,7.4.3 二进制文件的读写,例7-2:将随机产生的二进制数据写入文件,并验证写入结果是否正确。 Random r = new Random(); byte writeArr
23、ay = new byte10; /用随机数填充指定字节数组的元素 r.NextBytes(writeArray); Console.WriteLine(“数组中的数据:“); for (int i = 0; i writeArray.Length; i+) Console.WriteLine(“w0=1“, i, writeArrayi); ,7.4.3 二进制文件的读写,/将数据写入到文件,文件关闭前不允许其他进程操作该文件 FileStream fs = new FileStream(“test.bin“,FileMode.OpenOrCreate,FileAccess.Write, F
24、ileShare.None); BinaryWriter bw = new BinaryWriter(fs); Console.WriteLine(“正在写数据“); for (int i = 0; i writeArray.Length; i+) bw.Write(writeArrayi); bw.Close(); fs.Close(); Console.WriteLine(“数据已写入到文件test.bin中“);,7.4.3 二进制文件的读写,/从文件中读取二进制数据 Console.WriteLine(“文件test.bin的内容如下:“); fs = new FileStream(“
25、test.bin“, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs, System.Text.Encoding.Default); Console.WriteLine(br.ReadByte(); while (br.PeekChar() != -1) Console.WriteLine(br.ReadByte(); br.Close(); fs.Close(); Console.ReadLine();,7.5 FileSystemWatcher组件,组件功能用于监视本地计算机、网络驱动器或远程计算
26、机上的文件。 常用属性Filter : 文件筛选模式,确定监视哪些文件Path :要监视的目录路径NotifyFilter:要监视的更改类型EnableRaisingEvents :是否启用组件 常用事件Changed、Created、Deleted、Renamed 举例说明,FileSystemWatcher组件举例,【例7-3】演示FileSystemWatcher组件的用法。,51,文件和流,C#把每个文件当作顺序字节流处理。每个文件可以文件结束标记(EOF)结束,也可在指定字节数结束。当文件被打开时,C#会创建一个对象,然后把流和对象关联起来。 在C#中进行文件处理,需要引入Syste
27、m.IO命名空间,这个命名空间包括流类的定义,例如: StreamReader:用于从文件中输入文本 StreamWriter:用于输出文本到文件中 FileStream:用于文件输入输出 C#中包含许多执行输入输出的类。本课主要介绍StreamReader和StreamWriter类,文件结束标记,52,7.1 File和Directory类,计算机中的信息存储在文件中,而文件存放在目录(Windows称之为文件夹)中。File类用于操纵文件,Directory类用于操纵文件夹。File类不能直接读写文件,需要使用FileStream类或其派生类。 下面两页列出了File类和Director
28、y类中的部分方法。 你也可以使用“对象浏览器“来了解这两个类中的成员。注意了解这些方法如何使用。,53,7.1.1 File类,54,File类示例,示例代码位于“CSharp示例第8课FileSample”,55,获取文件信息代码,string output = “文件信息:rn“; string filename = txtFileName.Text;if (File.Exists(filename) output +=“t文件名:“+filename+“rn“;output +=“t创建时间:“ + File.GetCreationTime(filename) + “rn“;output
29、 +=“t最后修改时间:“+File.GetLastWriteTime(filename)+“rn“;output +=“t最后访问时间:“+File.GetLastAccessTime(filename)+“rn“;txtFileInfo.Text = output; else txtFileInfo.Text+=“rnt文件“+filename+“不存在!rn“; ,56,复制文件代码,string filename1 = txtFileName1.Text; string filename2 = txtFileName2.Text;if (File.Exists(filename1) t
30、ryFile.Copy(filename1,filename2,true);MessageBox.Show(“文件复制成功!“,“复制成功“);catch MessageBox.Show(“复制出错!可能是源文件无法读取或目标文件名错误!“,“复制出错“, MessageBoxButtons.OK, MessageBoxIcon.Error); else MessageBox.Show(“源文件“+filename1+“不存在!“,“复制出错“, MessageBoxButtons.OK,MessageBoxIcon.Exclamation); ,57,7.1.2 Directory类,58,
31、Dirtectory类示例,示例代码位于“CSharp示例第8课DirectorySample”,59,获取文件夹中的文件代码,string directoryName = txtDirName.Text;string output = “;if ( Directory.Exists(directoryName)/ 获取文件夹中的子文件夹名称string directoryList = Directory.GetDirectories(directoryName);foreach( string dirName in directoryList)output+=“文件夹 “+dirName+“
32、rn“;string fileList = Directory.GetFiles(directoryName);foreach( string fileName in fileList)output+=“文件 “+fileName+“rn“;txtInfo.Text = output;/ 后面还有,60,获取文件夹中的文件代码,elsetryDirectory.CreateDirectory(directoryName);txtInfo.Text = “文件夹“+directoryName+“创建成功!“;catchMessageBox.Show(“创建文件夹“+directoryName+“
33、出现未知的错误!“,“错误“,MessageBoxButtons.OK,MessageBoxIcon.Error);,61,7.2 文本文件的读写,StreamReader类继承自TextReader类,用于从文本文件中读取信息。 构造函数: StreamReader(path) StreamReader(path, encoding) path, string类型,要读取的文本文件名。 encoding, System.Text.Encoding类型,文件编码格式 常用方法: Read:读取一个字节或指定字节数 ReadLine:读取一行 ReadToEnd:读取到文件结束 Close:关闭
34、数据流,62,7.2 文本文件的读写,StreamWriter类继承自TextWriter类,以特定的编码方式将字符写入流中。 构造函数: StreamWriter(path) StreamWriter(path, append) StreamWriter(path, append, encoding) path, string类型,要读取的文本文件名。 append,bool型,是追加到原文件,还是创建新文件 encoding, System.Text.Encoding类型,文件编码格式 常用方法: Write:将字符串写入流 Close:关闭数据流,63,文件读写示例,示例代码位于“CSh
35、arp示例第8课TextEditor”,64,读取文本文件,65,保存文本文件,66,7.3 其它常用文件类,XmlTextReader, XmlTextWriter 提供对XML文件的读写,需要引入System.Xml命名空间 BinaryReader, Binarywriter 提供对二进制文件的读写,需要引入System.IO命名空间 FileStream 使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作 MemoryStream 创建以内存为存储区的流,67,7.4 上机作业,完成实验报告8: 参照课堂示例,编写一个能对文本文件进行读写的简单的文本编辑器,界面请自行设计。,