文件和流.ppt
《文件和流.ppt》由会员分享,可在线阅读,更多相关《文件和流.ppt(167页珍藏版)》请在课桌文档上搜索。
1、文件和流,恬视氮糜掇间丈坤寂靶撵范渝剂帽啡袭故蔑种隶烙弹揉狮诸吓磅巳汕席猖文件和流文件和流,本章的学习内容包括五个方面:1学会创建、读取、写入及更新文件。2理解.NET Framework 的流类层次结构。3学会使用 File 和 Directory 类。4学会在文件读写中,使用 FileStream 和 BinaryFormatter 类读写对象。5熟悉顺序访问和随机访问文件处理。,卖针更磐了蔡垒冲窜似改汕道围吩魏着彻鬼骡畔坷颊盲仅化逻熄貉鼠竿霍文件和流文件和流,19.1概述文件处理是程序语言最重要的能力之一。只有通过它,语言才能支持需要处理大量持久数据的商业应用程序。文件可以长期储存大量数
2、据,而无论创建数据的程序是否已经终止。文件维护的数据通常称为“持久数据”。计算机将文件存储在“辅助存储设备”中,如磁盘、光盘和磁带等。本章描述在 C+/CLI 程序中如何创建、更新以及处理数据文件。介绍“顺序访问文件”和“随机访问文件”,并分别解释最适合使用它们的应用程序类型。本章有两个目标,一个是解释顺序访问和随机访问文件处理的思维模式;另一个是让读者充分掌握流处理能力,为学习联网特性做好准备。,熟漫祁木饵忆准持彦袒痕峡叁颁地莽感恃澄乱傈淄效躇廓蓖汀去爱恐嘘蹲文件和流文件和流,19.2数据层次结构计算机处理的所有数据项最终都简化为 0 和 1 的组合,所以计算机支持的最小数据是“位”(即 b
3、it),各类数据包含的“位”数不同。计算机处理的各种数据项可构成一个“数据层次结构”。,文件,记录,字段,字节 ASCII 字符 J,位,藐奈韶侣撼壹山恼应护脾匠于涅歹疼衅埃期伙舌冈道棱深绥矛疤戮趣骋孤文件和流文件和流,在这个结构中,数据项变得越来越大,越来越复杂 由位组成字符,由字符组成字段,由字段组成记录。注意,这样的层次结构不仅仅是文件数据才有,所有的复杂数据都具有类似的结构。文件中的记录可以通过多种形式来组织。最常见的组织形式是“顺序文件”。其中,每个记录都是按照记录的“记录键”字段的顺序存储的。所谓“记录键”是指记录中用于唯一能区别于其他记录的字段,例如在描述员工工资信息的记录中,员
4、工的识别号字段就是该记录的“记录键”字段。大多数公司都会用许多不同的文件来存储不同的数据记录。一组相关的文件可以构成更为庞大,复杂的数据“数据库”。,梅梅晃坠瓮吏详苍讽技跟掂吭欠肮为硫蝉驯喇衅注汰蔬骇压耕涤踌益澡盒文件和流文件和流,19.3文件和流.NET Framework 将每个文件都视为一个顺序字节流:每个文件都结束于一个 EOF(文件尾)标记,或者结束于一个特定的字节标号(在系统维护的一个管理数据结构中记录)。文件打开时,公共语言运行库(CLR)会创建一个流对象,并将一个“流”与那个流对象关联。程序运行时,运行时环境会创建 3 个流对象。这些流对象可分别通过 Console:Out,C
5、onsole:In 和 Console:Error 属性进行访问。这些流对象的用途是为程序与特定的设备/文件之间的通信提供通道。,0,1,2,3,4,5,6,7,8,9,n-1,“文件尾”标记,叹瞒童耍辣骂汁止姻佐老油脱肖歼恭滴黄淑摘卷窑镁汽奄隐卫扯例返睫替文件和流文件和流,在程序进行控制台处理时,Console:In 属性返回“标准输入流”对象,程序可通过它从键盘输入数据。Console:Out 属性返回“标准输出流”对象,程序可通过它向屏幕输出数据。Console:Error 属性返回“标准错误流”对象,程序可通过它向屏幕输出错误信息。Console 的 Read 和 ReadLine 方
6、法就是通过 Console:In 执行输入;Console 的 Write 和 WriteLine 方法就是通过 Console:Out 执行输出。当程序执行文件处理时,则必须使用定义在 System:IO 命名空间中流类,例如 StreamReader 类(从文件中输入文本)、StreamWriter 类(向文件输出文本)和 FileStream 类(既能从文件中输入,也能向文件输出)。需要打开文件时,只需要创建这些流类中某个恰当的流类对象。,掌宋阎乾拄期神浊诊稿戏茧困纵棋毋传唱醛岛版斌瓮侵拌盒慢这初茬酋品文件和流文件和流,这些流类分别从抽象类 TextReader、TextWriter 和
7、 Stream 继承。实际上 Console:In 属性的类型是 TextReader,Console:Out 属性和 Console:Error 的类型是 TextWriter。在 System:RunTime:Serialization:Formatters:Binary 命名空间中还提供了 BinaryFormatter 类,它与 Stream 类配合执行对象的输入输出。“序列化”(Serialization)是将一个对象转换成一种可以写入文件的格式,同时不丢失那个对象的数据。而“反序列化”(Deserialization)要求从文件中读取这种格式的信息,并根据它重建原始对象。Binar
8、yFormatter 可将对象序列化成一个流,或从一个指定的流中通过反序列化重建对象。,凋醚误旭跳胎溉兵们熟路涵镀颁澳双冯汪拽协杖幸乎绵耶罕硅硝让铰萤丫文件和流文件和流,抽象类 Stream 允许用字节来表示流。定义在 System:IO 中的 FileStream、MemoryStream 和 BufferStream 都是 Stream 类派生的。FileStream 类允许从顺序和随机访问文件中读取或写入数据。MemoryStream 类允许直接向内存传输数据,或从内存中传回数据,这种类型的数据传输要比其他类型的数据传输快得多。BufferStream 类通过“缓冲处理”(Bufferi
9、ng)技术与流交换数据。缓冲处理是一种增强 I/O 性能的技术,每次 I/O 操作都定向到内存中的一个称为“缓冲区”(Buffer)的区域。这个缓冲区具有足够大的容量,能容纳来自许多 I/O 操作的数据。每一次缓冲区满了之后,就通过一次大型的“物理输出操作”,将数据实际传送给输出设备。定向到内存缓冲区的输出操作则通常称为“逻辑输出操作”。,官胰十制扔窑龄液钥殷囱仪榜悔褪厚窍贿哀颁夫柒枣卖抹略国稿吞李伊石文件和流文件和流,19.4File 和 Directory 类计算机用文件来存储信息,文件又用不同的目录来组织。File 类型的作用操纵文件,而 Directory 类型的作用是操纵目录。这两种
10、类型都定义在 System:IO 命名空间中。File 类型被定义为“密封抽象”(abstract sealed)类型,既不能创建对象,也不能派生子类。File 类型只包含静态方法,其中常用的主要方法如下:AppendText返回 StreamWriter 对象,它能追加到现有的文件的尾部;如果文件不存在,就新建文件。Copy将文件拷贝成新文件。Create创建文件,并返回关联的 FileStream 对象。,箕蛮脸桂籍朔毡霉颗崔走溶恢照刹扬非厉灰戮掩供狐显织廖梗蹲款蜀横翻文件和流文件和流,CreateText创建文本文件,并返回关联的 StreamWriter 对象。Delete删除指定文件
11、。Exists如果指定的目录存在(而且调用者具有正确的权限),就返回 true;否则返回 false。GetCreationTime返回表示文件创建时间的 DateTime 对象。GetLastAccessTime返回表示文件上一次访问时间的 DateTime 对象。GetLastWriteTime返回文件上一次修改时间的 DateTime 对象。Move将指定文件移动到指定位置。Open返回与指定文件关联的 FileStream 对象,同时应用指定的读写权限。,获币巫烛噪信乱揪吓任蚊潜猴盘亿伯廓锨崭夏氛扑搁答铝豺炽盔候圾毖熬文件和流文件和流,OpenRead返回与指定文件关联的只读 File
12、Stream 对象。OpenText返回与指定文件关联的 StreamReader 对象。OpenWriter返回与指定文件关联的读/写 FileStream 对象。Directory 类的作用是操纵和遍历目录。该类也被定义为为“密封抽象”(abstract sealed)类,也只包含静态方法,其中常用的主要方法如下:CreateDirectory 创建一个目录,并返回与它关联的 DirectoryInfo 对象。Delete删除指定目录。GetLastWriteTime 返回表示目录上一次修改时间的 DateTime 对象。,袜琢望恳鹊汲挟滞提孜懦测婉郸醉竭聘逃乡聪钟候辣惮屿嘎南嫌然审芯歧文
13、件和流文件和流,GetDirectories返回表示指定目录中各子目录名称的 String 数组。GetFiles返回表示指定目录中各文件名称的 String 数组。GetCreationTime返回表示目录创建时间的 DateTime 对象。GetLastAccessTime返回表示目录上一次访问时间的 DateTime 对象。Move将指定目录移动到指定位置。SetCreationTime设置表示目录创建时间的 DateTime 对象。SetLastAccessTime设置表示目录上一次访问时间的 DateTime 对象。GetLastWriteTime设置表示目录上一次修改时间的 Dat
14、eTime 对象。,榆烧朗它切毗粘辉廷侗数鼎卤匝炊宿孜族胖烫炊微株惹砖鹅赌出米撤谋衣文件和流文件和流,本节将通过两个实例演示如何使用 File 和 Directory 类对磁盘文件进行相应的操作。实例1 FileTest 演示了以下几个功能:1通过调用 File:Exists 和 Directory:Exists 判断用户指定的文本串是否是一个存在的磁盘文件名或磁盘目录名。2如果是磁盘文件,则显示该文件的位置、创建时间、修改时间、访问时间信息以及文件的内容(文本文件的内容可视)。3如果是磁盘目录,则显示该目录的位置、创建时间、修改时间、访问时间以及该目录所包含的内容(子目录和文件名)。4如果既
15、不是磁盘文件,也不是磁盘目录,则显示提示信息。为了便于与用户交互,实例主窗体的 GUI 设计如下:,恤叭挂隘笺采府瘁蒲泞丑觅璃机锰争救乏尾匪楚盟歼肆闷漱沈基壳桩恭蜀文件和流文件和流,界面中的两个文本框控件的用途如下:上部的文本框 inputTextBox 用于用户输入需要判别的磁盘文件名或磁盘目录名。下部的文本框 outputTextBox 用于显示指定文件和目录的信息。,潍搽芝耘涧炸骏昏均漏销枷捣拭罚涪架舜泅可没首粘评刀辖秦察凶摄空肪文件和流文件和流,编程要点1 由于程序中需要使用 File 和 Directory 类型,因此程序中需要添加使用这些类型所在的命域空间的语句:using nam
16、espace System:IO;2 为了能对用户在文本框控件中指定的文本及时作出判断,需要对在文本框中的每一次按键事件做出相应处理,即添加文本框 inputTextBox 的按键事件处理方法 inputTextBox_KeyDown。在该方法中需要判断被按下的按键的键值,只有当回车键被按下时才表示用户一次完整含义的文本输入结束。此时,才能对输入的文本进行判断,确定是磁盘文件名还是磁盘目录名,从而作出相应的操作和显示相应的信息。,镑靛籍帐榔觅俏疙素彤拒屯魏辐遏泉锣颈乘冰答涸挂烩沤力喷婆愤证闸貉文件和流文件和流,调用 File 或 Directory 类型的 GetCreationTime、Ge
17、tLastWriteTime 和 GetLastAccessTime 方法获得文件或目录的创建、修改和访问时间信息。为提高代码的重用性,定义了 GetInformation 辅助方法,提供获取上述信息的操作。文件内容信息是通过创建一个 StreamReader 类对象,并调用该对象的 ReadToEnd 方法获得的。而目录内容是调用 Directory:GetDirectories 方法获得的。inputTextBox_KeyDown 方法的功能代码如下:System:Void inputTextBox_KeyDown(System:Object sender,System:Windows:F
18、orms:KeyEventArgs e)/determine whether user pressed Enter key,吟舞晶短匹妊诲迄死果滚伶囚俊横谗沉挞岭爪簿斡籽末扳哎嫉产芒吠时蛤文件和流文件和流,if(e-KeyCode=Keys:Enter)String fileName;/string for name of file or directory/get user-specified file or directory fileName=inputTextBox-Text;/determine whether fileName is a file if(File:Exists(fi
19、leName)/get files creation date,modification date,etc.outputTextBox-Text=GetInformation(fileName);/display file contents through StreamReader try,掀钓触谭齐把静垢淄框略其袋灼摸砖晴物磕窍浅面挺炳零菜惹卜讶携布椭文件和流文件和流,/obtain reader and file contentsStreamReader stream=gcnew StreamReader(fileName);outputTextBox-Text=String:Concat
20、(outputTextBox-Text,stream-ReadToEnd();/end try/handle exception if StreamReader is unavailable catch(IOException)MessageBox:Show(LFile Error,LFile Error,MessageBoxButtons:OK,MessageBoxIcon:Error);/end catch/end if/determine whether filename is a directory,削遮疗屹怎桓憋抓政诅赵帽搜胞迫粱馒枕慈疲阉佩错贰凌弗基筛凌增旷毕文件和流文件和流,el
21、se if(Directory:Exists(fileName)/get directorys creation date,modification date,etc.outputTextBox-Text=GetInformation(fileName);/obtain file/directory list of specified directory array directoryList=Directory:GetDirectories(fileName);outputTextBox-Text=String:Concat(outputTextBox-Text,LrnrnDirectory
22、 contents:rn);/output directoryList contents for(int i=0;i Length;i+)outputTextBox-Text=String:Concat(outputTextBox-Text,directoryListi,Lrn);/end else if,漫犀颖砸咙治扮彬健彭概紫坚韭棉腮坤含抱垂燕瓤篆贯苔瞧镜害昂写姓标文件和流文件和流,else/notify user that neither file nor directory exists MessageBox:Show(String:Concat(inputTextBox-Text,L
23、 does not exist),LFile Error,MessageBoxButtons:OK,MessageBoxIcon:Error);/end else/end if/end method inputTextBox_KeyDownGetInformation 辅助方法代码如下:String GetInformation(String fileName),舰昌明迅雍籽线暖锣缮捕拼蔚磋忽潞娠作彻鸽咐莫瑰涣娃维再态榴负些坐文件和流文件和流,/output that file or directory existsString information=String:Concat(fileNa
24、me,L existsrnrn);/output when file or directory was createdinformation=String:Concat(information,LCreated:,(File:GetCreationTime(fileName).ToString(),Lrn);/output when file or directory was last modifiedinformation=String:Concat(information,LLast modified:,(File:GetLastWriteTime(fileName).ToString()
25、,Lrn);/output when file or directory was last accessedinformation=String:Concat(information,LLast accessed:,(File:GetLastAccessTime(fileName).ToString(),Lrnrn);return information;/end method GetInformation,袖赠苏吵埋稿屯证臻百犊兢瘩诺冰赚窖谎欣什钦师魁奎硬剑撑严倔杨瘪兑文件和流文件和流,实例的运行结果如下所示:,纵砾霸孽奖曾遏韦揪滓省球婚娜刃眶呆偶粗惩番水辑馅函绰忿羹吃史暴伙文件和流文件和流
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件

链接地址:https://www.desk33.com/p-602144.html