Presentation is loading. Please wait.

Presentation is loading. Please wait.

第六章 目录与文件管理 6.1 目录管理 6.2 文件管理 6.3 文件的读写.

Similar presentations


Presentation on theme: "第六章 目录与文件管理 6.1 目录管理 6.2 文件管理 6.3 文件的读写."— Presentation transcript:

1 第六章 目录与文件管理 6.1 目录管理 6.2 文件管理 6.3 文件的读写

2 本章主要内容: 目录的创建、移动和删除 FolderBrowserDialog控件 文件的创建、移动、复制和删除
OpenFileDialog控件和SaveFileDialog控件 对文件的读写等操作

3 用于文件 I/O 的类 Directory 提供通过目录和子目录进行创建、移动和枚举的静态方法。DirectoryInfo 类提供实例方法。
DirectoryInfo 提供通过目录和子目录进行创建、移动和枚举的实例方法。Directory 类提供静态方法。 DriveInfo 提供访问有关驱动器的信息的实例方法。 File 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream。FileInfo 类提供实例方法。 FileInfo 提供用于创建、复制、删除、移动和打开文件的实例方法,并协助创建 FileStream。File 类提供静态方法。 FileStream 支持通过其 Seek 方法随机访问文件。默认情况下,FileStream 以同步方式打开文件,但它也支持异步操作。File 包含静态方法,而 FileInfo 包含实例方法。 FileSystemInfo 是 FileInfo 和 DirectoryInfo 的抽象基类。 Path 提供以跨平台的方式处理目录字符串的方法和属性。 DeflateStream 提供使用 Deflate 算法压缩和解压缩流的方法和属性。 GZipStream 提供压缩和解压缩流的方法和属性。默认情况下,此类使用与 DeflateStream 类相同的算法,但可以扩展到使用其他压缩格式。 SerialPort 提供控制串行端口文件资源的方法和属性。 File、FileInfo、DriveInfo、Path、Directory 和 DirectoryInfo 是密封(在 Microsoft Visual Basic 中为 NotInheritable)类。可以创建这些类的新实例,但它们不能有派生类。

4 用于从流读取和写入流的类 BinaryReader 和 BinaryWriter 从 Streams 读取或向 Streams 写入编码的字符串和基元数据类型。 StreamReader 通过使用 Encoding 进行字符和字节的转换,从 Streams 中读取字符。 StreamWriter 通过使用 Encoding 将字符转换为字节,向 Streams 写入字符。 StringReader 从 Strings 中读取字符。StringReader 允许用相同的 API 来处理 Strings,因此输出可以是 String 或以任何编码表示的 Stream。 StringWriter 向 Strings 写入字符。StringWriter 允许您用相同的 API 来处理 Strings,因此您的输出可以是 String 或以任何编码表示的 Stream。 TextReader 是 StreamReader 和 StringReader 的抽象基类。抽象 Stream 类的实现用于字节输入和输出,而 TextReader 的实现用于 Unicode 字符输出。 TextWriter 是 StreamWriter 和 StringWriter 的抽象基类。抽象 Stream 类的实现用于字节输入和输出,而 TextWriter 的实现用于 Unicode 字符输出。

5 通用 I/O 流类 BufferedStream 是向另一个 Stream(例如 NetworkStream)添加缓冲的 Stream。
(FileStream 内部已具有缓冲,MemoryStream 不需要缓冲。)BufferedStream 可以围绕某些类型的流来构成以提高读写性能。缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。 MemoryStream 是一个非缓冲的流,可以在内存中直接访问它的封装数据。该流没有后备存储,可用作临时缓冲区。 NetworkStream 是从 Stream 派生的,但它不属于 System.IO 命名空间,而是在 System.Net.Sockets 命名空间中。

6 6.1 目录管理 在System.IO命名空间下, 有两个类对磁盘和目录进行操作管理 : Directory类 DirectoryInfo类 相同点: 均能对目录进行操作 区 别: 前者必须被实例化后才能使用,而后者则只提供了静态的方法。如果多次使用某个对象一般使用前者;如果仅执行某一个操作则使用后者提供的静态方法效率更高一些。

7 6.1 目录管理 (续) 1.DirectoryInfo类的构造函数形式:
6.1 目录管理 (续) 1.DirectoryInfo类的构造函数形式: public DirectoryInfo( string path); path表示目录所在的路径,注意使用的路经不能包含空格等非法字符。 如果希望使用特殊路径,像“我的文档” 文件夹、“开始”菜单文件夹、“桌面”文件夹等,可以用System.Environment.SpecialFolder下的枚举,例 如,得到“我的文档”文件夹的方法为: System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal)

8 2.DirectoryInfo类的主要属性:
Attributes 获取或设置当前FileSystemInfo的FileAttributes。 Exists 获取指示目录是否存在的布尔值 FullName 获取当前路径的完整目录名

9 6.1 目录管理 (续) Parent 获取指定子目录的父目录 Root 获取根目录 CreationTime 获取或设置当前目录创建时间
6.1 目录管理 (续) Parent 获取指定子目录的父目录 Root 获取根目录 CreationTime 获取或设置当前目录创建时间 LastAccessTime 获取或设置上一次访问当前目录的时间 LastWriteTime 获取或设置上一次写入当前目录的时间

10 6.1 目录管理 (续) 3.Directory类提供的静态方法 CreateDirectory 创建指定路径中的所有目录。
6.1 目录管理 (续) 3.Directory类提供的静态方法 CreateDirectory 创建指定路径中的所有目录。 Delete 删除指定的目录。 Exists 确定给定路径是否引用磁盘上的现有目录 GetCreationTime 获取目录的创建日期和时间 GetCurrentDirectory 获取应用程序的当前工作目录 GetDirectories 获取指定目录中子目录的名称。 GetFiles 返回指定目录中的文件的名称。 GetFileSystemEntries 返回指定目录中所有文件和子目录的名称。 GetLastAccessTime 返回上次访问指定文件或目录的日期和时间

11 6.1 目录管理 (续) GetLastWriteTime 返回上次写入指定文件或目录的日期和时间 GetParent
6.1 目录管理 (续) GetLastWriteTime 返回上次写入指定文件或目录的日期和时间 GetParent 检索指定路径的父目录,包括绝对路径和相对路径 Move 将文件或目录及其内容移到新位置 SetCurrentDirectory 将应用程序的当前工作目录设置为指定的目录 SetLastAccessTime 设置上次访问指定文件或目录的日期和时间 SetLastWriteTime 设置上次写入目录的日期和时间

12 6.1.1 目录的创建、删除与移动 1.目录的创建 若指定的目录不存在,则按path的指定创建所有目录和子目录。如:
目录的创建、删除与移动 1.目录的创建 CreateDirectory方法(Directory类中) 用于创建指定路径中的所有目录,方法原型: public static DirectoryInfo CreateDirectory (string path) 参数:path为要创建的目录路径。 若指定的目录不存在,则按path的指定创建所有目录和子目录。如: Directory.CreateDirectory(“c:\\test”); Directory.CreateDirectory("c:\\test\\t1\\t2");

13 6.1.1 目录的创建、删除与移动 (续) 2.目录的删除 Delete方法( Directory类)
目录的创建、删除与移动 (续) 2.目录的删除 Delete方法( Directory类) 用于删除指定的目录,该方法有两种重载的形式: 1) public static void Delete (string path) path为要移除的空目录的名称。此目录必须为可写或为空。 2) public static void Delete (string path,bool recursive) path为要移除的目录的名称,不区分大小写; recursive是一个布尔值,若要移除path中的目录、子目录 和文件,则为 true;否则为 false。

14 6.1.1 目录的创建、删除与移动 (续) 例 创建并删除指定的目录 using System; using System.IO;
目录的创建、删除与移动 (续) 例  创建并删除指定的目录 using System; using System.IO; class Test { public static void Main() //指定要操作的目录 string path try //确定目录是否存在 if (Directory.Exists(path))

15 6.1.1 目录的创建、删除与移动 (续) { Console.WriteLine("目录已存在"); return; } //创建目录
目录的创建、删除与移动 (续) { Console.WriteLine("目录已存在"); return; } //创建目录 DirectoryInfo di = Directory.CreateDirectory(path); Console.WriteLine("成功创建目录:{0}", Directory.GetCreationTime(path)); //删除目录 di.Delete(); Console.WriteLine("目录已删除"); catch (Exception e) Console.WriteLine("程序异常: {0}", e.ToString());

16 6.1.1 目录的创建、删除与移动 (续) 3.目录的移动 Move方法( Directory类)能够重命名或移动目录 方法原型为:
目录的创建、删除与移动 (续) 3.目录的移动 Move方法( Directory类)能够重命名或移动目录 方法原型为: public static void Move (string sourceDirName, string destDirName) sourceDirName 为要移动的文件或目录的路径;destDirName 为指向sourceDirName的新位置的目标路径。 允许sourceDirName和destDirName参数指定相对或绝对路径信息。

17 6.1.2 FolderBrowserDialog控件
功能:用于显示用户选择文件夹的对话框。 注意FolderBrowserDialog类在System.Windows.Forms命 名空间下,无法继承该类。 调用FolderBrowserDialog类的ShowDialog方法:可以 打开对话框,提示用户浏览、创建并最终选择一个文件 夹。只能选择文件系统中的文件夹,不能选择虚拟文件 夹。只允许用户选择文件夹而非文件。文件夹的浏览通过 树控件完成。

18 6.1.2 FolderBrowserDialog控件(续)
Description 获取或设置对话框中在树视图控件上显示的说明文本。 RootFolder 获取或设置从其开始浏览的根文件夹。 SelectedPath 获取或设置用户选定的路径。 Tag 获取或设置一个对象,该对象包含控件的数据。 (从 CommonDialog 继承) CanRaiseEvents获取一个指示组件是否可以引发事件 的值。(从 Component 继承 )

19 6.1.2 FolderBrowserDialog控件(续)
Dispose 释放由 Component 占用的资源。 Reset 将属性重置为其默认值。 ShowDialog 运行通用对话框。 Equals 确定两个Object实例是否相等(从Object继承。) GetService 返回一个对象,该对象表示由Component或它的Container提供的服务(从Component继承)

20 6.1.2 FolderBrowserDialog控件(续)
RootFolder设置为开始浏览的位置。或将SelectedPath设 置为最初选定的RootFolder子文件夹的绝对路径。也可 以选择设置Description属性为用户提供附加说明。最后 调用ShowDialog方法将对话框显示给用户。 FolderBrowserDialog 是有模式对话框,在显示时,它会阻止应用程序剩余部分的运行,直到用户选定了文件夹。

21 6.1.2 FolderBrowserDialog控件(续)
例 :单击Windows窗体按钮,打开FolderBrowserDialog对话框的使用示例。 如图:

22 6.1.2 FolderBrowserDialog控件(续)
代码 : private void button1_Click(object sender, EventArgs e) { DialogResult result = folderBrowserDialog1.ShowDialog(); if (result == DialogResult.OK) textBox1.Text = folderBrowserDialog1.SelectedPath; } else textBox1.Text = "";

23 6.2 文件管理 File类和FileInfo类 为FileStream对象的创建和文件的创建、复制、移动、删除、打开等提供了支持。使用这两个类对文件进行操作时必须具备相应的权限否则将产生异常。 相同点:都能完成对文件的操作。 不同点:FileInfo类必须实例化,并且每个FileInfo的实例必须对应于系统中一个实际存在的文件。如果打算多次重用某个对象,可考虑使用FileInfo的实例方法,而不是File类的相应静态方法。

24 6.2.1 文件复制、删除与移动 1.文件复制 File类的Copy方法用于将现有文件复制到新文件。方法 原型为:
文件复制、删除与移动 1.文件复制 File类的Copy方法用于将现有文件复制到新文件。方法 原型为: public static void Copy (string sourceFileName,string destFileName) 参数:sourceFileName为要复制的文件,destFileName为目标 文件的名称。它不能是一个目录或现有文件。

25 6.2.1 文件复制、删除与移动(续) 例: using System; using System.IO; class Test {
文件复制、删除与移动(续) 例: using System; using System.IO; class Test { public static void Main() string path string path2 try File.Delete(path2); File.Copy(path, path2); Console.WriteLine("{0}复制到{1}", path, path2);

26 6.2.1 文件复制、删除与移动(续) //再次复制相同的文件,操作失败 File.Copy(path, path2);
文件复制、删除与移动(续) //再次复制相同的文件,操作失败 File.Copy(path, path2); Console.WriteLine("再次复制相同的文件,操作失败"); } catch (Exception e) { Console.WriteLine("不允许进行二次复制"); Console.WriteLine(e.ToString());

27 6.2.1 文件复制、删除与移动(续) 2. 文件删除 File类的Delete方法用于删除指定的文件。如果指定的文
文件复制、删除与移动(续) 2. 文件删除 File类的Delete方法用于删除指定的文件。如果指定的文 件不存在,则不引发异常。方法定义: public static void Delete (string path) 参数:path为要删除的文件的名称。 例: using System; using System.IO; class FileTest { public static void Main()

28 6.2.1 文件复制、删除与移动(续) Console.WriteLine("确定要删除指定目录下的所有文件?");
文件复制、删除与移动(续) Console.WriteLine("确定要删除指定目录下的所有文件?"); Console.WriteLine("点击'Y' 键继续,任意键取消"); int a = Console.Read(); if(a == 'Y' || a == 'y') { Console.WriteLine("正在删除文件..."); } else

29 6.2.1 文件复制、删除与移动(续) Console.WriteLine("操作被取消"); return; }
文件复制、删除与移动(续) Console.WriteLine("操作被取消"); return; } DirectoryInfo dir = new foreach (FileInfo f in dir.GetFiles()) { f.Delete();

30 6.2.1 文件复制、删除与移动(续) 3. 文件移动 using System; using System.IO; class Test
文件复制、删除与移动(续) 3. 文件移动 File类的Move方法用于将指定文件移到新位置,并提供指定新文件名的选项。方法原型为: public static void Move (string sourceFileName, string destFileName) 参数:sourceFileName为要移动的文件的名称,destFileName 为文件的新路径。 例: using System; using System.IO; class Test

31 6.2.1 文件复制、删除与移动(续) { public static void Main()
文件复制、删除与移动(续) { public static void Main() string path string path2 try if (!File.Exists(path)) FileStream fs = File.Create(path); fs.Close(); } if (File.Exists(path2))

32 6.2.1 文件复制、删除与移动(续) File.Delete(path2); } //移动文件
文件复制、删除与移动(续) File.Delete(path2); } //移动文件 File.Move(path, path2); Console.WriteLine("文件由{0}移动到{1}", path, path2); //判断文件是否存在 if (File.Exists(path)) { Console.WriteLine("源文件存在"); else Console.WriteLine("源文件不存在");

33 6.2.1 文件复制、删除与移动(续) } catch (Exception e) {
文件复制、删除与移动(续) } catch (Exception e) { Console.WriteLine("操作取消: {0}", e.ToString());

34 文件属性与设置 自学

35 6.2.3 OpenFileDialog控件 功能:用于显示用户打开文件的对话框。
OpenFileDialog类属于System.Windows.Forms命名空间,无法继承该类。 使用此类可检查某个文件是否存在并打开该文件。 ShowReadOnly属性确定是否在对话框中显示只读复选框; ReadOnlyChecked属性指示是否选中只读复选框。

36 例:单击Windows窗体按钮,打开OpenFileDialog对话框。
代码: private void button1_Click(object sender, EventArgs e) { DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) textBox1.Text = openFileDialog1.FileName; else textBox1.Text = ""; }

37 6.2.3 OpenFileDialog控件(续) 代码:
private void button1_Click(object sender, EventArgs e) { DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) textBox1.Text = openFileDialog1.FileName; } else textBox1.Text = "";

38 6.2.4 SaveFileDialog控件 SaveFileDialog控件用于显示用户保存文件的对话框,提示用户选择文件的保存位置。
SaveFileDialog类属于System.Windows.Forms命名空间,无法继承该类。使用此类可以打开和改写现有文件,也可以创建新文件。

39 6.3 文件的读写 在System.IO命名空间中提供了多种类型用于进行数据文件和数据流的读写操作。

40 文件和流 文件(file)和流(stream)即有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、CD 等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下,文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。

41 文件和流 (续) 流是字节序列的抽象概念,如文件、输入输出设备、内部进程通信管道或者TCP/IP套接字等均可以看成流。流提供一种向后备存储器写入字节和从后备存储器读取字节的方式。 除了和磁盘文件直接相关的文件流以外,还有多种其它类型的流,如分布在网络中、内存中和磁带中的流,分别称为网络流、内存流和磁带流。 所有表示流的类都是从抽象基类Stream继承的。

42 6.3.1 文件和流 (续) 写入:把变量中的数据写入到流中。 定位:重新设置流的当前位置,以便随机读写。 流的操作有三类:
文件和流 (续) 流的操作有三类: 读取:从流中读取数据到变量中。 写入:把变量中的数据写入到流中。 定位:重新设置流的当前位置,以便随机读写。 File类的静态方法主要是用于创建FileStream类。一个 FileStream类的实例实际上代表一个磁盘文件,使用 FileStream类对文件系统上的文件进行读取、写入、打开和 关闭操作,并对其它与文件相关的操作系统句柄进行操 作,如管道、标准输入和标准输出。读写操作可以指定为 同步或异步操作。FileStream对输入输出进行缓冲,从而提 高了系统的性能。

43 6.3.2 文件的打开 打开指定路径上的FileStream,可以使用File类的Open方法或OpenRead方法或OpenText方法。
文件的打开 打开指定路径上的FileStream,可以使用File类的Open方法或OpenRead方法或OpenText方法。 其中Open打开文件的方式有三种,如下表所示 : 名称 说明 File.Open (String, FileMode) 打开指定路径上的 FileStream,具有读/写访问权限。 File.Open (String, FileMode, FileAccess) 以指定的模式和访问权限打开指定路径上的 FileStream。 File.Open (String, FileMode, FileAccess, FileShare) 打开指定路径上的 FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项。

44 6.3.2 文件的打开 (续) FileMode值用于指定在文件不存在时是否创建该文件, 并确定是保留还是改写现有文件的内容;
文件的打开 (续) FileMode值用于指定在文件不存在时是否创建该文件, 并确定是保留还是改写现有文件的内容; FileAccess值指定可以对文件执行的操作; FileShare值指定其它线程所具有的对该文件的访问类型。

45 6.3. 3 文本文件的读写 利用Open方法打开文件后,可以用StreamReader类来读
文本文件的读写 利用Open方法打开文件后,可以用StreamReader类来读 取文件的内容,用StreamWriter类向文件写入内容,它们提 供了按文本模式读写数据的方法。 下面例子中用到的OpenText方法是File类的一个静态方 法,不能被某个具体的File类的实例调用。

46 6.3. 3 文本文件的读写(续) 例.从一个文本文件中读取内容并显示在屏幕上。 using System;
文本文件的读写(续) 例.从一个文本文件中读取内容并显示在屏幕上。 using System; using System.IO; class FileTest { public static void Main() StreamReader sr; try sr = File.OpenText("c:\\c#\\file1\\file1.txt"); } catch

47 6.3. 3 文本文件的读写(续) Console.WriteLine("文件打开失败"); return; }
文本文件的读写(续) Console.WriteLine("文件打开失败"); return; } while (sr.Peek()!=-1) { String str = sr.ReadLine(); Console.WriteLine (str); Console.WriteLine ("到达文件结尾"); sr.Close();

48 6.3. 3 文本文件的读写(续) 例:向文本文件中写入文本流。 using System; using System.IO;
文本文件的读写(续) 例:向文本文件中写入文本流。 using System; using System.IO; class FileTest { public static void Main() StreamWriter sw; try sw = File.CreateText("c:\\c#\\file1\\file2.txt"); }

49 6.3. 3 文本文件的读写(续) catch { Console.WriteLine("文件创建失败"); return; }
文本文件的读写(续) catch { Console.WriteLine("文件创建失败"); return; } sw.WriteLine ("网址:"); sw.WriteLine (" sw.WriteLine (" sw.WriteLine (" sw.WriteLine (" sw.Close();

50 6.3.4 二进制文件的读写 BinaryReader和BinaryWriter类 在System.IO中,用于按二进制模式读写文件 。
二进制文件的读写 BinaryReader和BinaryWriter类 在System.IO中,用于按二进制模式读写文件 。 它们提供的一些读写方法是对称的,如针对不同的数据结构: BinaryReader提供了ReadByte、ReadBoolean、 ReadInt、ReadInt16、ReadDouble、ReadString等方法。 BinaryWriter则提供了WriteByte、WriteBoolean、 WriteInt、WriteInt16、WriteDoubleWriteString方法。

51 6.3.4 二进制文件的读写(续) 例:将内存中随机产生的二进制数据写入文件,并验证写 入结果是否正确。 using System;
二进制文件的读写(续) 例:将内存中随机产生的二进制数据写入文件,并验证写 入结果是否正确。 using System; using System.IO; class BinaryRW { static void Main() int i = 0; //创建随机数据写入流 byte[] writeArray = new byte[1000];

52 6.3.4 二进制文件的读写(续) new Random().NextBytes(writeArray);
二进制文件的读写(续) new Random().NextBytes(writeArray); BinaryWriter binWriter = new BinaryWriter(new MemoryStream()); BinaryReader binReader = new BinaryReader(binWriter.BaseStream); try { //将数据写入流 Console.WriteLine("正在写数据…"); for(i = 0; i < writeArray.Length; i++) binWriter.Write(writeArray[i]); } //流定位到开始位置

53 6.3.4 二进制文件的读写(续) binReader.BaseStream.Position = 0; //读取流中的数据
二进制文件的读写(续) binReader.BaseStream.Position = 0; //读取流中的数据 for(i = 0; i < writeArray.Length; i++) { if(binReader.ReadByte() != writeArray[i]) Console.WriteLine("写数据错"); return; } Console.WriteLine("数据已写入");

54 6.3.4 二进制文件的读写(续) } //捕获EndOfStreamException异常,输出错误信息
二进制文件的读写(续) } //捕获EndOfStreamException异常,输出错误信息 catch(EndOfStreamException e) { Console.WriteLine("写数据出错\n{0}", e.GetType().Name);


Download ppt "第六章 目录与文件管理 6.1 目录管理 6.2 文件管理 6.3 文件的读写."

Similar presentations


Ads by Google