《C#-程序设计教程第8章.ppt》由会员分享,可在线阅读,更多相关《C#-程序设计教程第8章.ppt(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第8章 流与文件 8.1 流的基本概念 8.2 目录 8.3 File类和FileInfo类 8.4 文件的读写04 二月 2023第第8 8章章 流与文件流与文件04 二月 20238.1 8.1 流的基本概念流的基本概念 文件(File)是计算机的基本概念,一般指存储于外部介质上的信息集合。每个文件应有一个包括设备及路径信息的文件名。其中外部介质主要指硬盘,也可包括光盘、软盘或磁带等。信息是数据和程序代码的总称。在程序中,文件的概念不单是狭义地指硬盘上的文件,所有的有输入输出功能的设备,例如键盘,控制台,显示器,打印机都被视为文件。这就是广义的文件的概念。就输入输出操作来说,这些外设和硬盘
2、上的文件是一致的,对于程序员来说文件只与信息的输入输出相关,而且这种输入输出是串行序列形式的。于是,人们把文件的概念抽象为“流”(stream)。04 二月 20238.1 8.1 流的基本概念流的基本概念 由此可见,文件流是程序语言按顺序操作文件内容的一种方式,是现实内外存数据交换的方法。在C#中则表现为一组派生于Stream的文件流类。例如FileStream类,以字节为单位读写文件;BinaryRead类和BinaryWrite类,以基本数据类型为单位读写文件,可以从文件直接读写bool、string、short、int等基本数据类型数据;StreamReader和StreamWrite
3、r类以字符或字符串为单位读写文件。使用流读写文件必须引入命名空间:System.IO。04 二月 20238.1 8.1 流的基本概念流的基本概念 C#为操作文件提供其他辅助类,包括DriveInfo、Directory、DirectoryInfo、File、FileInfo类。常用的类:File-实用类,提供许多静态方法,用于移动、删除、和复制文件。Directory-实用类,提供许多静态方法,用于移动、删除和复制目录。Path-实用类,用于处理路径名称。FileInfo-表示磁盘上的物理文件,具有可以处理此文件的方法,要完成对文件的读写工作,就必须创建Stream对像。DirectoryI
4、nfo-表示磁盘上的物理目录,具有可以处理此目录的方法FileStream-表示可以被写或被读,或二者都可的文件,此文件可以同步或异步读和写StreamReader-从流中读取字符数据,并可通过使用FileStream被创建为基类。StreamWriter-向流写字符数据,可通过使用FileStream被创建为基类。04 二月 2023 8.2 8.2 目录目录 在.NET中,我们可以用DriveInfo来获取驱动器信息。例如可以获得盘符、卷标、类型、大小、剩余空间等驱动器信息。注意:直接访问DriveInfo的属性、方法时,可能会抛出异常。例如,程序所在的机器上没有安装软驱,但WINDOWS
5、默认加载了软驱的驱动,所以程序在访问 myDrive.DriveFormat 属性时会因为无法争取读取软驱的格式而抛出异常。解决方法也很简单,在访问之前加入if(myDrive.IsReady)来对驱动器的有效性进行验证。例8-1使用DriveInfo类获得驱动器信息。不同的电脑运行结果不同。04 二月 2023Visual C#2008程序设计程序设计 8.2 8.2 目录目录8.2.2 Directory8.2.2 Directory类类 将 Directory 类用于典型操作,如复制、移动、重命名、创建和删除目录,8-1表列出了Directory类的主要成员。他们都是静态成员方法,所以不
6、需要实例化Directory类即可使用。上述Directory的静态方法的最主要的参数为string类型的路径。在接受路径的成员中,路径可以是指文件或仅是目录。指定路径也可以是相对路径或者绝对路径。例如,以下都是可接受的路径:“c:MyDir”表示C盘下的名为“MyDir”文件夹。“MyDirMySubdir”表示程序当前路径下的相对路径,例如,如果程序在C盘根目录,则该相对路径及等同于“c:MyDirMySubdir”。“MyServerMyShare”表示远程机器MyServer(IP或机器名)上的“MyShare”目录例如,代码 Directory.Delete(“c:MyDir”),将
7、删除C:MyDir目录。这里的“”第一个反斜杠为C#所定义的转义字符。【例8-2】使用Directory类建立文件目录。04 二月 2023 8.2 8.2 目录目录 上节我们介绍了上节我们介绍了DirectoryDirectory类,类,DirectoryDirectory提供提供了一组静态方法,帮助用户完成对目录的操作。由了一组静态方法,帮助用户完成对目录的操作。由于是静态方法,使用时不需要实例化,即可调用。于是静态方法,使用时不需要实例化,即可调用。但这也意味着该类无法为用户保存运行上下文及状但这也意味着该类无法为用户保存运行上下文及状态信息。因此,态信息。因此,DirectoryDir
8、ectory的静态方法都需要安全检的静态方法都需要安全检查。如果打算多次重用某个对象,可考虑使用查。如果打算多次重用某个对象,可考虑使用 DirectoryInfo DirectoryInfo 的实例方法,而不是的实例方法,而不是 DirectoryDirectory 类类的相应静态方法,因为并不总是需要安全检查。的相应静态方法,因为并不总是需要安全检查。【例8-3】使用DirectoryInfo类建立文件目录。04 二月 2023 8.3 File 8.3 File类和类和FileInfoFileInfo类类 File File 类用于对文件的典型操作,如复制、移动、类用于对文件的典型操作,
9、如复制、移动、重命名、创建、打开、删除和追加到文件。重命名、创建、打开、删除和追加到文件。类似于类似于DirectoryDirectory类,类,FileFile的主要方法也为静态型。这意的主要方法也为静态型。这意味用户无须实例化即可调用方法完成相应操作。味用户无须实例化即可调用方法完成相应操作。File File类的方法大多需要输入类的方法大多需要输入StringString型的路径参数,型的路径参数,表明用户需要操作哪个文件。这些方法可接受的路径的表明用户需要操作哪个文件。这些方法可接受的路径的表达方式与表达方式与DirectoryDirectory类相同类相同 04 二月 2023 8.
10、3 File 8.3 File类和类和FileInfoFileInfo类类 与File类不同的是,FileInfo类在使用时需要实例化。调用构造函数public FileInfo(string fileName)输入路径做为参数,可构造对象操作相应的文件。FileInfo与File的关系就如同DirectoryInfo与Directory的关系一样。由于FileInfo的实例方法不总是做安全性检查,当用户需要反复调用方法操作文件时,使用FileInfo的实例方法效率可能高一些。【例8-4】使用File和FileInfo类建立文件。04 二月 20238.4 8.4 文件的读写文件的读写 我们知
11、道任何数据包括字符,在计算机我们知道任何数据包括字符,在计算机(包括文件)中是以二进制方式存储的。那么如(包括文件)中是以二进制方式存储的。那么如何用二进制字节来表示各种字符呢。这就是字符何用二进制字节来表示各种字符呢。这就是字符编码(也称为字符集)所要规定的内容。编码(也称为字符集)所要规定的内容。最早使用最早使用ASCII7ASCII7位字符集作为计算机通用位字符集作为计算机通用的标准化编码,它规定了的标准化编码,它规定了128128个(后来扩展到个(后来扩展到256256个)拉丁字母的字节表示法。很显然,该编个)拉丁字母的字节表示法。很显然,该编码无法表示中文汉字字符、希腊字符、阿拉伯字
12、码无法表示中文汉字字符、希腊字符、阿拉伯字符等非拉丁字符。符等非拉丁字符。04 二月 20238.4 8.4 文件的读写文件的读写 为此,各个国家都创建了支持本国语言的为此,各个国家都创建了支持本国语言的字符集,例如中文字符集字符集,例如中文字符集GB 2312GB 2312、GBKGBK、GB GB 18030-200518030-2005等。当然,各个国家的字符集显等。当然,各个国家的字符集显然无法被世界上所有其他国家的计算机软件系统然无法被世界上所有其他国家的计算机软件系统所支持。举例来说,程序使用所支持。举例来说,程序使用GB 2312GB 2312编码方编码方式在文件中存储字符式在文
13、件中存储字符“A”A”。该文件被发送到国。该文件被发送到国外某计算机中,如果该计算机上读文件的软件不外某计算机中,如果该计算机上读文件的软件不支持支持GB 2312GB 2312操作系统,转而用其默认的编码操作系统,转而用其默认的编码来解释该文件,那么用户很可能会得到一些奇怪来解释该文件,那么用户很可能会得到一些奇怪的字符而非字符的字符而非字符A A。这就是我们程序开发过程中。这就是我们程序开发过程中经常遇到的乱码问题。经常遇到的乱码问题。04 二月 20238.4 8.4 文件的读写文件的读写 为了解决乱码问题,实现软件的国际化,为了解决乱码问题,实现软件的国际化,国际标准化组织制定了国际标
14、准化组织制定了UnicodeUnicode、UTF-8UTF-8等字符等字符集作为国际标准。这些字符集包含了世界上所有集作为国际标准。这些字符集包含了世界上所有国家的字符。只要按国际标准的编码存储字符到国家的字符。只要按国际标准的编码存储字符到文件中,那么其他按国际标准读文件的系统就一文件中,那么其他按国际标准读文件的系统就一定能得到相同的字符。定能得到相同的字符。综上所述,我们在读写文件过程中一定要综上所述,我们在读写文件过程中一定要注意编码问题。使用某种编码存储字符,那么也注意编码问题。使用某种编码存储字符,那么也要用该编码来读文件。要用该编码来读文件。04 二月 20238.4 8.4
15、文件的读写文件的读写 文件是计算机系统持久保存数据的一种方式。按照所存储的数据的不同,可分为文本文件和数据文件。文本文件被程序用来存储字符,例如英文字符、汉字、数学符号等等。程序用某种编码,将文件中的二进制解释为某些字符。数据文件被程序用以存储非字符数据,例如图像数据等。程序按照一定规则,对数据进行解释。例如,JPG图像文件,被读入程序后,按照JPG标准即可显示为一幅图片。04 二月 20238.4 8.4 文件的读写文件的读写 文本文件与数据文件自身并没有什么区别。二者在后缀文本文件与数据文件自身并没有什么区别。二者在后缀名、存储方式上并没有本质区别。程序可以用名、存储方式上并没有本质区别。
16、程序可以用txttxt为后缀的文为后缀的文件存字符文本,也可以用件存字符文本,也可以用binbin为后缀的文件存(只不过为后缀的文件存(只不过WindowsWindows操作系统无法自动将操作系统无法自动将binbin关联到记事本程序罢了)。关联到记事本程序罢了)。决定文件分类的其实是程序对文件的存储内容及解释方式。如决定文件分类的其实是程序对文件的存储内容及解释方式。如果程序将字符作为内容存入文件,并以字符方式来解析文件中果程序将字符作为内容存入文件,并以字符方式来解析文件中的数据,那么我们就可以把这个文件称为文本文件;如果程序的数据,那么我们就可以把这个文件称为文本文件;如果程序直接将二进
17、制字节数据存入文件,并将文件中的数据直接读到直接将二进制字节数据存入文件,并将文件中的数据直接读到为内存中的二进制字节变量中,再进行进一步处理,那么该文为内存中的二进制字节变量中,再进行进一步处理,那么该文件就是数据文件。件就是数据文件。04 二月 20238.4 8.4 文件的读写文件的读写 由此可见文本文件与数据文件的本质区别其实是程序由此可见文本文件与数据文件的本质区别其实是程序读写文件所采用的方式。在读写文件所采用的方式。在C#C#中,提供了中,提供了FileStreamFileStream类,可类,可按字节方式来读写文件;提供了按字节方式来读写文件;提供了StreamReaderSt
18、reamReader、StreamWrtierStreamWrtier类,并以某种编码将字符写入或读出文件。类,并以某种编码将字符写入或读出文件。使用使用FileStreamFileStream类可以建立文件流对象,用来打开和关类可以建立文件流对象,用来打开和关闭文件,以字节为单位读写文件。也可以对于文件相关的操作闭文件,以字节为单位读写文件。也可以对于文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。系统句柄进行操作,如管道、标准输入和标准输出。FileStreamFileStream类对象能对输入输出进行缓冲,从而提高性能。类对象能对输入输出进行缓冲,从而提高性能。【例8-5】读
19、写文件,写字节数组数据到文件的程序如下,该程序将建立文件c:bytefile.bin,再将文件中的内容读出并显示到控制台界面。04 二月 20238.4 8.4 文件的读写文件的读写 FileStream类操作的是字节和字节数组,而StreamReader允许将字符和字符串写入文件,它根据某字符编码(由用户通过参数指定,采用操作系统默认)转换为内存中的字符串变量,StreamWriter对象用于将内存中的字符串变量按某种字符编码写入文件。StreamReader、StreamWriter对象为用户提供了向文件中存取字符的方法,其内部使用了FileStream类从文件中读取字节,并利用了高效的字符串处理层为用户完成了字节到内存字符串变量的相互转化的底层工作。在C#中,如果用户不明确指出编码,则默认使用UTF-8编码。【例8-6】使用了StreamReader和StreamWriter类,先写字符串到文件,再从中读取出来。
限制150内