第9章文件操作C#程序设计教程9.1文件和流1.文件的概念文件是指存储在外存储器(磁盘、磁带、光盘、网络存储等)上的信息的有序集合。数据以文件的形式存放在外存储器中,每个文件有一个唯一的区分于其他文件的名称,称为文件名,操作系统对文件的访问是通过文件名来实现的。每个文件除了有文件名外,还有文件路径、创建时间、操作权限等属性。应用程序和外部存储之间通过文件传递数据。文件可以长期保留下来,方便用户随时操作。9.1文件和流2.流的概念在.NETFramework中,对文件的所有操作都要用“流”来实现。流是字节序列的抽象概念,流提供了一种工作方式,使得程序设计人员在设计程序读取文件中的内容时,不需要考虑文件所在硬件的细节及存储格式。根据流的方向,把流分为两种:输入流和输出流。输入流:将外部数据(文件或外部设备)输入到程序可以访问的内存空间中,供程序使用。输出流:将程序的中间结果或最终结果从内存存储空间中输出到文件。而根据流中的数据形式,可将流分为文本流和二进制流。文本流:文本流中流动的数据是以字符的形式存在的。流中的每一个字符对应一个字节,存放对应的字符的ASCII码。二进制流:二进制流中的数据是根据程序编写它们的形式写入到文件或者设备中,而且完全根据它们从文件或者设备读写的形式读入到程序中,它们并未做任何改变,所以所读写的字节数也与外部设备或文件中的相同,这种类型的流非常适合非文本数据,但其内容用户无法读懂。9.1文件和流3.用于输入和输出的类在C#中,几乎所有的输入输出类都包含在System.IO命名空间中。所以要想引用这些输入输出类,必须在C#中引用这个命名空间才可以,格式如下:usingSystem.IO;9.1文件和流3.用于输入和输出的类(1)DriveInfo类DriveInfo类用于获取驱动器的相关信息,包括驱动器的盘符、类型、可用空间等。DriveInfo类的常用属性。DriveInfo的常用方法成员有:GetDrives(),这是一个静态方法,用于检索计算机上所有逻辑驱动器的DriveInfo对象数组。【例9-1】DriveInfo类的使用—显示所有驱动器,并显示驱动器的属性9.1文件和流3.用于输入和输出的类(2)Directory类和DirectoryInfo类.NET框架提供的用于目录管理的类有Directory类、DirectoryInfo类和Path类。Directory类和DirectoryInfo类的功能相似,都可以实现对目录及其子目录的创建、移动、删除等操作。两者之间的区别是:Directory类是静态类,不能使用new关键字创建对象,其提供的静态方法,程序设计人员可以直接使用。而DirectoryInfo类是一个需要实例化的类。【例9-2】Directory类的使用实例-在当前目录下创建文件夹Directory类的常用静态方法:9.1文件和流3.用于输入和输出的类(2)Directory类和DirectoryInfo类.NET框架提供的用于目录管理的类有Directory类、DirectoryInfo类和Path类。Directory类和DirectoryInfo类的功能相似,都可以实现对目录及其子目录的创建、移动、删除等操作。两者之间的区别是:Directory类是静态类,不能使用new关键字创建对象,其提供的静态方法,程序设计人员可以直接使用。而DirectoryInfo类是一个需要实例化的类。DirectoryInfo类的方法与Directory类的静态方法大体相同,除此之外,DirectoryInfo类的常用属性成员有:Name:目录名称。Exists:指示目录是否存在。Parent:父目录。Root:根目录。如果需要执行某个操作,使用Directory类的静态方法的效率比相应的DirectoryInfo实例方法高。9.1文件和流3.用于输入和输出的类(3)Path类和Directory类相比,Path类更灵活、更全面,它可以操作路径的各个部分,包括:驱动器盘符、目录名、文件名、文件扩展名和分隔符等。【例9-3】Path类使用实例staticvoidMain(string[]args){stringpath1=@C:\ProgramFiles\MicrosoftOffice\Office14\1.txt;Console.WriteLine(该路径的根目录为:\t{0},Path.GetPathRoot(path1));Console.WriteLine(文件名为:\t\t{0},Path.GetFileName(path1));Console.WriteLine(扩展名为:\t\t{0},Path.GetExtension(path1));Console.WriteLine(绝对路径为:\t\t{0},Path.GetFullPath(path1));Console.ReadLine();}9.1文件和流3.用于输入和输出的类(4)File类和FileInfo类File类和FileInfo类是用于文件管理的类,它们在功能上非常相似,都可以实现对文件的创建、删除、复制、移动和打开等操作。File类是静态类,FileInfo类使用时需要实例化对象。【例9-4】File类的应用实例—显示选中文件的相关属性File类的静态方法:FileInfo类的主要属性:staticvoidMain(string[]args){if(File.Exists(c:\\a.txt))//判断a.txt是否存在{File.AppendAllText(C:\\a.txt,这是一个C#文件实例);//向文件中追加文字}else{File.Copy(C:\\b.txt,c:\\a.txt);//将b.txt复制为a.txt,要求b.txt必须已存在}DateTimedt1=File.GetCreationTime(C:\\a.txt);//获取a.txt的创建时间Console.WriteLine(文件a.txt的创建时间为:{0},dt1);Console.ReadLine();}9.2文件读写操作9.2.1FileStream类FileStream类是Stream的派生类,可以用来表示磁盘或网络路径上指向文件的流。Filestream类提供了对文件读写字节的方法,更适合于读取二进制文件。9.2文件读写操作9.2.1FileStream类1.FileStream类的构造函数(1)publicFileStream(stringpath,FileModemode)功能:创建一个FileStream类的新实例,并按FileMode指定的模式打开文件。例如:FileStreamfs=newFileStream(c:\\a.txt,FileMode.OpenOrCreate);(2)publicFileStream(stringpath,FileModemode,FileAccessaccess)path:包括文件完整路径在内的文件名。mode:枚举类型,规定了如何打开文件,及把文件指针定位在哪里以完成后续操作。access:枚举类型,规定了流的作用。功能:创建一个FileStream类的新实例,按FileMode模式打开文件,并按FileAccess所指定的方式对文件进行访问。例如:FileStreamfs=newFileStream(c:\\a.txt,FileMode.Create,FileAccess.Write);9.2文件读写操作9.2.1FileStream类2.文件位置大多数情况下,打开文件,文件指针指向文件的开始位置,但文件指针可以根据程序设计人员的要求进行修改。Seek()方法实现文件指针定位,使用形式如下:filestream.Seek(longoffset,SeekOriginorigin)offset:规定了文件指针的移动距离,是一个long型数据。original:指明移动的起始位置,是一个枚举类型,包含3个枚举成员:Begin(文件开始)、Current(当前位置)、End(文件末尾)。例如:FileStreamfs=newFileStream(c:\\a.txt,FileMode.Open,FileAccess.Read);fs.Seek(8,SeekOrigin.Current);将文件指针从文件开始处向后移动8个字节。fs.Seek(-10,SeekOrigin.End);将文件指针从文件末尾向前移动10个字节9.2文件读写操作9.2.2文本文件的读写1.StreamReader类功能:定义一个文本读取流,使以一种特定的编码从字节流中读取字符。(1)StreamReader类的构造函数①只带一个文件名的构造函数:publicStreaReader(stringpath)②指定编码方式的构造函数:publicStreaReader(stringpath,Encodingencoding)path:要读取的文件的路径。Encoding:读取文件的编码方式,可使用Default选项。例如:StreamReadersr(“c:\\a.txt”,Encoding.ASCII)(2)StreamReader类的方法9.2文件读写操作9.2.2文本文件的读写1.StreamWriter类StreamWriter类用于向文件中写入文本。(1)StreamWriterer类的构造函数①只带文件名的构造函数:publicStreamWriter(stringpath)例如:StreamWritersw=newStreamWriter(“c:\\b.txt”);②指明编码方式并可以追加的构造函数publicStreamWriter(stringpath,boolappend,Encodingencoding)例如:StreamWritersw=newStreamWriter(“c:\\b.txt”,true,Encodeing.Default);以写并追加的方式打开C:\b.txt,编码方式为Default。(2)StreamWriter类的方法【例9-5】文本文件读写实例9.2文件读写操作9.2.3读写二进制文件.NET框架还提供了两个专门对二进制文件读写的类:BinaryReader和BinaryWriter。1.BinaryReaderBinaryReader用来读取二进制文件。构造函数:①基于所提供的流,用UTP-8字符编码来初始化BinaryReader的新实例:publicBinaryReader(Streaminput)②基于所提供的流和特定的字符编码,初始化BinaryReader的新实例:publicBinaryReader(Streaminput,Encodingencoding)不管是BinaryReader还是BinaryWriter操作对象只能是文件流,不可以是文件路径。方法:常用方法有ReadByte、ReadChar、ReadDecimal、ReadDouble、ReadInt32、ReadString等。读取数据时,可以使用BinaryReader类的PeekChar()方法来检测是否到达了流的末尾,如果到达流的末尾,PeekChar()方法返回值-1。9.2文件读写操作9.2.3读写二进制文件.NET框架还提供了两个专门对二进制文件读写的类:BinaryReader和BinaryWriter。2.BinaryWriter类BinaryWriter用来对二进制文件写入数据。构造函数:①基于所提供的流,用UTF-8字符编码来初始化BinaryWriter类的新实例。publicBinaryWriter(Streamoutput)②基于所提供的流和特定的字符编码,初始化BinaryWriter类的新实例。publicBinaryWriter(Streamoutput,Encodingencoding)方法:Write()方法用于向流中写入数据。Seek()方法用于移动流的