程序设计全套文件和流PPT课件_第1页
程序设计全套文件和流PPT课件_第2页
程序设计全套文件和流PPT课件_第3页
程序设计全套文件和流PPT课件_第4页
程序设计全套文件和流PPT课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.,1,第11章 文件和流,.,2,内容简介,C#语言采用C+和Java语言中流的概念,来处理输入/输出方面的问题,但是使用起来要简单的多。本章介绍C#语言中,如何处理目录和文件夹,如何处理文件,如何使用流的概念读写文件。,.,3,目录,11.1 文件和流的概念,11.2 对话框,11.3 多文档操作,本章小结,.,4,C#语言具有平台无关性,不允许程序直接访问I/O设备,对包括文件在内的设备的I/O操作是以流的形式实现的,流是进行数据读写操作的基本对象。通过流的概念,程序员可以把输入和输出的数据看作是一个字节序列的数据流,而不必关心具体设备的特定细节。.NET中基于流的I/O操作方式,大大简

2、化了开发人员的工作。 在C#中,有两种类型的流:文本流(text stream)和二进制流(binary stream)。 (1)文本流。文本流是指在流中流动的数据是以字符的形式出现的。流中的每一个字符对应一个字节,用于存放对应的ASCII码值,因此文本流中的数据可以显示和打印出来,都是用户可以读懂的信息。,11.1 文件和流的概念,.,5,(2)二进制流。二进制流中的数据是按照二进制编码的方式来存放文件的。二进制数据也可在屏幕上显示,但其内容无法读懂。二进制流是由与外部设备中的内容一一对应的一系列字节组成的。使用二进制流时没有字符翻译过程,而且所读写的字节数也与外部设备中的相同。 在.NET

3、框架中,所有的输入和输出操作都要用到流。在System.IO命名空间中,包含了绝大部分与I/O操作相关的类。下面将重点介绍与文件管理和操作相关的类,以及如何利用它们来实现文件的读写。,11.1 文件和流的概念,.,6,11.2 文件的存储管理,.NET框架所提供的文件系统操作的类大多位于System.IO命名空间中,常用的类有DriveInfo、Directory、DirectoryInfo、Path、File、FileInfo等,通过这些类可以浏览文件系统和执行相关操作(如移动、复制和删除文件)。,.,7,11.2.1 DriveInfo类,.NET框架提供了DriveInfo类和Drive

4、Type枚举类型,以便于在程序中直接使用驱动器。 DriveInfo类提供了访问有关驱动器的信息的实例方法,使用DriveInfo类,可以确定有关驱动器的信息,包括驱动器盘符、驱动器类型、驱动器上的可空间等用。 DriveType枚举类型定义了驱动器类型常数,使用DriveType枚举类型,可以辅助确定DriveInfo类实例的驱动器类型。 DriveInfo类的常用属性成员如表13-1所示,见教材。常用的方法成员是GetDrives,用于检索计算机上的所有逻辑驱动器的驱动器名称,并返回DriveInfo类型的数组。,.,8,DriveType枚举型的枚举值有7个:CDRom(光驱)、Fixe

5、d(固定磁盘,即硬盘)、Network(网络驱动器)、NoRootDirectory(没有根目录的驱动器)、Ram(RAM磁盘,如内存)、Removable(可移动设备,如软盘、U盘)和Unknown(未知类型的驱动器)。 例如,要输出NTFS格式的硬盘驱动器的可用空闲空间大小,可编写代码如下:,11.2.1 DriveInfo类,.,9,DriveInfo drivers = DriveInfo.GetDrives(); foreach (DriveInfo dr in drivers) if(dr.DriveType=DriveType.Fixed ,11.2.1 DriveInfo类,.

6、,10,Directory和DirectoryInfo类是.NET框架提供的用于目录管理的类。每个驱动器都有一个根目录,使用“”表示。 Directory和DirectoryInfo类的功能非常相似,利用它们,可以完成对目录及其子目录的创建、移动、删除等操作,甚至还可以定义隐藏目录和只读目录。 二者的区别在于:Directory类是一个静态类,其中提供的是静态方法,不能使用new关键字创建其对象;DirectoryInfo类是一个需要实例化的类,该类的实例对象表示计算机上的某一目录。 Directory类的常用静态方法如表13-2所示,见教材。,11.2.2 Directory和Directo

7、ryInfo类,.,11,11.2.2 Directory和DirectoryInfo类,DirectoryInfo类的属性成员有Name(目录名称)、Exists(指示目录是否存在)、Parent (父目录)、Root(根目录); 常用的方法成员有Create(创建目录)、CreateSubDirectory(创建子目录)、Delete(删除目录)、GetDirectories(获取当前目录的子目录)、GetFiles(获取当前目录的文件列表)、MoveTo(移动目录)等。,.,12,由于Directory类的所有方法都是静态的,如果只想执行一个目录操作,使用Directory静态方法的效率

8、比使用相应的DirectoryInfo实例方法更高。大多数Directory方法要求给出当前操作目录的路径,且Directory类的静态方法都执行安全检查。但是,如果打算多次重用某个目录对象,可考虑使用DirectoryInfo的相应实例方法,因为它并不总是需要安全检查。,11.2.2 Directory和DirectoryInfo类,.,13,.NET框架提供了Path类,以便于在程序中管理文件和目录路径。所谓路径,就是文件或目录所在的位置。要检索某个文件,必须首先确定该文件的路径。 路径由驱动器盘符、目录名、文件名、文件扩展名和分隔符组成,有两种表示方法: 一种是从驱动器的根目录开始书写,

9、例如C:WindowsSystem32notepad.exe,这种路径称为绝对路径; 另一种是从当前目录位置开始书写,例如System32notepad.exe(假设当前目录为C:Windows),这种路径称为相对路径。,11.2.3 Path类,.,14,使用路径时要注意,C#将反斜杠“”作为转义符。因此,当路径表示为字符串时,要使用两个反斜杠表示,例如“C:WindowsSystem32notepad.exe”。 C#还允许在字符串前添加“”标志,以提示编译器不要把“”字符视作转义符,而是视作普通字符,例如C:WindowsSystem32notepad.exe。,11.2.3 Path类

10、,.,15,Path类是一个静态类,可以用来操作路径的各个部分,如驱动器盘符、目录名、文件名、文件扩展名和分隔符等。 Path类的常用属性成员有DirectorySeparatorChar(目录分隔符)、PathSeparator(路径分隔符)、VolumeSeparatorChar(卷分隔符)等; 常用的方法成员有GetDirecotryName(获取目录名)、GetExtension(获取文件扩展名)、GetFileName(获取文件名)、GetFullPath(获取完整路径)、HasExtension(确定路径是否包括文件扩展名)等。,11.2.3 Path类,.,16,11.2.3 P

11、ath类,例如,要输出路径C:WindowsSystem32notepad.exe中的目录名和文件名,可编写代码如下: string path = e:WindowsSystem32notepad.exe; Console. WriteLine(Path. GetDirectoryName(path); Console. WriteLine(Path.GetFileName(path); 上述代码中,目录名为C:WindowsSystem32,文件名为notepad.exe。 提示: Path类的大多数成员不与文件系统交互,并且不验证路径字符串指定的文件是否存在,但Path成员会验证指定路径字

12、符串的内容。如果字符串包含无效的字符,则引发ArgumentException异常。,.,17,File和FileInfo类是.NET框架提供的用于文件管理的类,它们在功能上非常相似。 使用File和FileInfo类,可以完成对文件的创建、删除、复制、移动和打开等操作,也可以获取和设置文件的有关信息,还可以协助创建FileStream流对象。 二者的区别在于,File类提供静态方法,而FileInfo类提供实例方法。,11.2.4 File和FileInfo类,.,18,1File类 File类是一个静态类,它通过一系列静态方法来提供对磁盘文件的操作功能(如创建、复制、删除、移动和打开文件)

13、,并协助创建FileStream对象。 File类的主要方法成员有Create(创建新文件)、Copy(复制文件)、Delete(删除文件)、Exists(判断文件是否存在)、Move(移动文件)、Open(打开文件)、 Replace(替换文件)、AppendAllText(将指定的文本追加到文件中,如果文件不存在则创建该文件)等。,11.2.4 File和FileInfo类,.,19,11.2.4 File和FileInfo类,1File类 例如,在C盘根目录下有一个名为“a.txt”的文件,如果要对该文件进行复制、移动、替换和删除操作,可编写代码如下: File.Copy(C:a.txt

14、,C:b.txt ); /将a.txt复制到b.txt if (File.Exists(D:a.txt) /如果D盘的a.txt存在 File.Replace(C:a.txt,D:a. txt); /用C盘的a.txt替换D盘的a. txt else File.Move(C:a.txt,D:a.txt);/将a.txt移动到D盘 File.Delete (C:b.txt); /删除b.txt文件,.,20,11.2.4 File和FileInfo类,1File类 提示: 在表示文件路径名的字符串中,如果只写出文件名而不写出完整的路径名,那么默认目录就是当前程序可执行文件所在的目录。 对于Win

15、dows应用程序,可通过Application类的静态属性StartupPath来获得程序可执行文件所在的目录路径。 每个文件都有自己的属性信息,其中文件的创建时间、最近一次访问时间和最近一次修改间,可通过如下方法进行读写:,.,21,11.2.4 File和FileInfo类,1File类 /读取文件创建时间 DateTime dt1 = File.GetCreationTime(C:a.txt); /设置文件创建时间 File.SetCreationTime(C:a.txt,dt1.AddDays(10); /读取文件最近一次访问时间 Console.WriteLine(File.GetL

16、astAccessTime(C:a.txt); /读取文件最近一次修改时间 Console.WriteLine(File.GetLastWriteTime(C:a.txt); File.SetLastAccessTime(C:a.txt,dt1 );/设置文件访问时间 File.SetLastWriteTime(C:a.txt,dt1 ); /设置文件修改时间,.,22,1File类 文件的其他属性信息则可通过File类的GetAttributes方法来获得,该方法返回一个FileAttributes枚举值,其枚举值包括Normal(普通文件)、Archive(存档文件)、ReadOnly(只

17、读文件)、Hidden(隐藏文件)、Compressed(压缩文件)等。 需要注意的是,一个文件的FileAttributes值可以是多个枚举值的“或”运算。例如,对于一个只读隐藏文件,GetAttributes方法返回的值将是 FileAttributes.ReadOnly | FileAttributes.Hidden。,11.2.4 File和FileInfo类,.,23,11.2.4 File和FileInfo类,1File类 File类还可用于读写文件内容,其中ReadAllText方法用于将文件所有内容读取为一个字符串,而WriteAlIText方法则将字符串写入文件。 例如: F

18、ile.WriteAllText(C:a.txt, 我爱北京天安门); Console.WriteLine(File.ReadAllText(C:a.txt);,.,24,1File类 为了进一步方便文本读写, File类还提供了将文件各行依次读取到一个字符串数组的ReadAllLines方法,以及将字符串数组逐行写入文件的WriteAllLines方法。 此外, File类的ReadAlIBytes方法可以将文件的所有字节读取到一个byte数组中,WriteAllBytes方法则将一个byte数组写入到文件中。,11.2.4 File和FileInfo类,.,25,11.2.4 File和F

19、ileInfo类,2FileInfo类 与File类不同, FileInfo类仅可用于实例化的对象。如果使用同一个对象执行多个操作,使用FileInfo类就比较有效,因为在构造FileInfo类的对象时将读取合适文件的身份认证和其他信息,无论对每个对象调用了多少方法,都不需要再次读取这些信息。而File类在调用每个静态方法时,需要多次检查文件的内容。 FileInfo类的主要方法成员有Create(创建新文件)、CopyTo(复制文件)、Delete(删除文件)、MoveTo(移动文件)、Open(打开文件)、Replace(替换文件)等。,.,26,11.2.4 File和FileInfo类

20、,2FileInfo类 例如,在C盘根目录下有一个名为“test.txt”的文件,如果要将该文件复制到D盘,可编写代码如下: FileInfo file1 = new FileInfo(C:test.txt); filel.CopyTo(D:test.txt); 上述代码段与以下代码具有相同的效果: File.Copy(C:test. txt,D:test.txt); 第一个代码段执行的时间较长,因为需要实例化一个Filelnfo对象file1(但file1可以对同一个文件执行更多的操作)。,.,27,11.2.4 File和FileInfo类,2FileInfo类 在实例化FileInfo类

21、的过程中,如果表示文件的路径不存在,系统就会抛出一个异常。FileInfo类提供了Exists属性来确定文件路径是否存在,例如: FileInfo file1 = new FileInfo(C:test.txt); Console.WriteLine(filel.Exists.ToString(); 上述代码中,如果系统中存在“C:test.txt”文件,那么将返回true,否则返回false。 在确定了是否存在对应的文件之后,就可以使用许多属性来确定文件的信息,这些属性可以用来更新文件。,.,28,11.3 文件的操作,文件在操作时表现为流,.NET中文件的输入输出都要用到流。流分为输入流和

22、输出流,通常输入流用于读取数据(如键盘和鼠标),输出流用于向外部目标写数据(如显示器的屏幕)。本章主要讨论的输入流和输出流仅限于磁盘文件。 流支持以下三个基本操作: (1) 读取(read):表示把数据从流传输到某种数据结构中,例如把数据从流输出到byte数组中; (2) 写入(write):表示把数据从某种数据结构传输到流中,例如把byte数组中的数据传输到流中; (3) 定位(seek):表示在流中查询或重新定位当前位置。,.,29,在.NET中,使用System.IO命名空间中的抽象基类Stream来代表流,其他表示流的类都是从Stream类继承的。数据源可以是文本字符串,也可以是从网络

23、或某个I/O端口上的设备传来的数据原始字节。 Stream类的派生类处理原始字节,TextReader和TextWriter类的派生类处理文本字符串。,11.3 文件的操作,.,30,11.3 文件的操作,.,31,Stream类是流的抽象基类,定义了流的基本功能,该类定义了一些处理原始字节流的范型成员,其作用是将数据抽象为独立于底层数据设备的字节流。 1. Stream类的常用属性 根据I/O设备的不同,不同的流可能只支持Stream类中定义的功能中的一部分。例如,NetworkStream(网络流)不支持定位。 通过使用Stream类及其派生类的CanRead、CanWrite、CanSe

24、ek等属性,可以查询当前流所支持的操作。,11.3.1 Stream类,.,32,2. Stream类的常用方法 Stream类提供了Read、Write、Seek等方法来支持流的基本操作,具体如下: (1)public virtual void Close() 【功能】关闭当前流,并释放与之关联的所有资源。 (2)public abstract void Flush() 【功能】清除当前流的所有缓冲区,并将所有缓冲数据写入到基础设备。,11.3.1 Stream类,.,33,2. Stream类的常用方法 (3)public abstract int Read (byte buffer,in

25、t offset,int count) 【功能】从当前流中读取最多count个字节,用它们顺序替换字节数组buffer的offset到(offset + count - 1 ) 之间的元素值,并将此流中的位置提升读取的字节数,最后返回读取的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数;如果当前已到达流的末尾,则为0。 (4)public virtual int ReadByte() 【功能】从当前流中读取一个字节,并将流内的位置向前推进一个字节,如果已到达流的末尾,则返回-1 。,11.3.1 Stream类,.,34,2. Stream类的常用方法 (

26、5)public abstract void SetLength(long value) 【功能】将当前流的长度设置为value。 (6)public abstract void Write (byte buffer,int offset,int count) 【功能】将字节数组buffer中从offset到 (offset + count - 1)之间的元素值写入当前流,并将此流中的当前位置提升写入的字节数。,11.3.1 Stream类,.,35,2. Stream类的常用方法 (7)public virtual void WriteByte(byte value) 【功能】将字节valu

27、e写入流内的当前位置,并将流内位置向前推进一个字节。 (8)public abstract long Seek(long offset,SeekOrigin origin) 【功能】设置当前流中的位置并返回该位置。其中,参数origin用于获取新位置的参考点,offset指示相对于origin参数的字节偏移量。origin是SeekOrigin枚举类型的参数,该枚举类型定义了用于表示流中的参考点以供进行查找的枚举值常量,包括Begin(指定流的开头)、Current(指定流内的当前位置)和End(指定流的结尾)。,11.3.1 Stream类,.,36,2. Stream类的常用方法 注意:

28、C#中,I/O操作都是在当前位置进行。新建一个流对象时,当前位置一般位于流的起始位置,即Position属性值为0。 每次对流进行读写后,当前位置都会相应改变,也可以使用Position属性或Seek方法有目的地改变流中的当前位置。,11.3.1 Stream类,.,37,FileStream类是Stream的派生类,使用它可以创建一个文件流。 FileStream类可以对文件系统上的文件进行读取、写入、打开和关闭等操作,读写操作可以指定为同步或异步操作。而且,FileStream类对输入、输出进行了缓冲,从而提高了处理的性能。 FileStream类主要用于二进制文件的读写。要读写二进制文件

29、,首先必须实例化一个FileStream对象。,11.3.2 FileStream类,.,38,1. FileStream类的构造函数 创建一个FileStream对象,要调用其构造函数。为了创建不同属性的文件流,FileStream类中定义了多种构造函数。,11.3.2 FileStream类,.,39,2. 使用FileStream对象读写字节 文件流是对物理文件的封装,比如一个文件的内容可能分散在磁盘的多个地方,但通过FileStream对象仍可以进行连续的字节流读写,从字节流到物理存储的映射细节由FileStream对象隐藏。使用FileStream对象来读写字节,以进行文件的读、写、

30、打开、关闭等操作。 例如,下面的代码创建了一个FileStream对象,通过该对象的WriteByte方法向文件中依次写入一组字节: FileStream fs = new FileStream (C:a.txt, FileMode.Create,FileAccess.ReadWrite); for(byte x=1; x=10; x+) fs.WriteByte(x) ; 但是,这种方式只适合ASCII字符(对应编码在O255之间),而不适合汉字等Unicode字符。,11.3.2 FileStream类,.,40,2. 使用FileStream对象读写字节 使用完FileStream对象后

31、,一定要记住使用其Close方法来关闭文件流,这样才能保持文件的完整性。例如:fs.Close(); 关闭流会释放与它相关的系统资源,并允许其他应用程序为同一个文件设置新的流。 在打开流和关闭流之间可以读写其中的数据,使用ReadByte和Read方法从文件中读取二进制数据,使用WriteByte和Write方法向文件中写入二进制数据。,11.3.2 FileStream类,.,41,StreamReader和StreamWriter类用于读写文本文件。不同于Stream的派生类, StreamReader和StreamWriter类用于处理文本而不是原始字节。它们分别继承自抽象类TextRe

32、ader和TextWriter类,而TextReader和TextWriter类则定义了将文本作为字符进行读写的方法。要注意的是,这些方法依靠底层的FileStream对象完成具体的数据传输。 FileStream类只能处理原始字节,这使得它可以用来处理任何数据文件。但不能使用FileStream类将数据直接读写到字符串中,而必须将字符串转换为字节数组,或者进行相反的操作。StreamReader和StreamWriter类提供了按文本模式读写数据的方式。如果编程人员知道某个文件中包含文本,就可以使用它们方便地进行文本读取操作。,11.3.3 StreamReader和StreamWriter

33、类,.,42,使用StreamReader和StreamWriter类提供的方法,可以根据流的内容自动检测出停止读取文本的位置。 例如,使用StreamReader.ReadLine()方法可以一次读取一行文本,使用StreamWriter.WriterLine()方法可以一次向文本文件中写入一行文本。 在读取文件时,流能够自动确定下一个回车符的位置,并在该处停止读取。在写入文件时,流会自动把回车符和换行符添加到文本的尾部。 StreamReader和StreamWriter类能够识别不同的编码模式,其默认编码为UTF-8,而不是ASCII。,11.3.3 StreamReader和Strea

34、mWriter类,.,43,1. 使用StreamReader读文本文件 StreamReader对象用于从文件中读取文本,可以从底层Stream对象创建StreamReader对象实例,也可以指定编码规范参数。 (1)StreamReader的构造函数。创建一个StreamReader对象,要调用其构造函数,StreamReader类中定义了多种构造函数,常用构造函数的语法格式如下: 【格式1】public StreamReader(string path) 【格式2】public StreamReader(Stream stream) 【格式3】public StreamReader(string path, bool detectEncoding) 【格式4】public StreamReader(string path, Encoding encoding),11.3.3 StreamReader和StreamWriter类,.,44,11.3.3 StreamReader和StreamWriter类,1. 使用StreamRe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论