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