文件和流.ppt

上传人:夺命阿水 文档编号:602144 上传时间:2023-09-07 格式:PPT 页数:167 大小:1.58MB
返回 下载 相关 举报
文件和流.ppt_第1页
第1页 / 共167页
文件和流.ppt_第2页
第2页 / 共167页
文件和流.ppt_第3页
第3页 / 共167页
文件和流.ppt_第4页
第4页 / 共167页
文件和流.ppt_第5页
第5页 / 共167页
点击查看更多>>
资源描述

《文件和流.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,袖赠苏吵埋稿屯证臻百犊兢瘩诺冰赚窖谎欣什钦师魁奎硬剑撑严倔杨瘪兑文件和流文件和流,实例的运行结果如下所示:,纵砾霸孽奖曾遏韦揪滓省球婚娜刃眶呆偶粗惩番水辑馅函绰忿羹吃史暴伙文件和流文件和流

26、,实例2 FileSearch 的功能是报告在指定的磁盘目录路径中所包含的每种类型的文件数量。同时该实例还提供了简单的“磁盘清理”功能 如果遇到具有 bak 扩展名的备份文件时,就显示一个消息框,询问是否将其删除。实现上述功能,需要综合运用 File 类型、Directory 类型,以及处理正则表达式的 Regex 类型和 Match 类型。为了能使用户方便地指定需要查询的磁盘目录和清晰看到相应的磁盘目录信息,需要在主窗体中自上而下添加如下控件:标签框 directoryLabel 用于显示当前被查询的磁盘目录名。标签框 directionsLabel 用于提示输入指定查询的磁盘目录名。文本框

27、 inputTextBox 用于接收输入的指定查询的磁盘目录名。,希押剿噪剐驹妓漂昨端溃怂嗽钢责莲旭炯谎喉菇瘁晦塑淄含诊凌侥请估优文件和流文件和流,按钮 searchButton 用于发出查询指定磁盘目录的命令。文本框 outputTextBox 用于显示指定磁盘目录中文件信息。程序的 GUI 设计如下:,要康诽肛搭柏始尸略今塞冰穗碟蔑跺拉坊潜先宙愿痉楔镐就慕怎菜徘脊澈文件和流文件和流,编程要点1 由于程序中需要使用 File、Directory、NameValueCollection、Regex、和 Match 类型,因此程序中需要添加使用这些类型所在的命域空间的语句:using names

28、pace System:IO;using namespace System:Text:RegularExpressions;using namespace System:Collections:Specialized;2 在主窗体 Form1 中除了需要添加与界面控件关联的控件类型对象外,还需要添加两个与查询磁盘目录信息直接相关的数据成员:,邪钙沸酷臭惹字睡咙涸震防眼作詹穗辆细烟裁嚏盾膛滋勘颈穿蔓罪抛那王文件和流文件和流,String 类型数据成员 searchDirectory 用于存放指定的磁盘目 录名。NameValueCollection 类型数据成员 found 用于存放被查询得 到

29、的指定磁盘目录信息的文本集合。NameValueCollection 类型是一个由键/值映射构成的集合,其中键和值都是 String 类型对象。对 NameValueCollection 类型对象的键/值映射成员的访问既 可以通过索引值,即按键/值映射元素的添加顺序访问;也 可以根据键值来索引访问。,公奏签旧训愤泳粗鼎协杀毙庙菩卷团直兑架它跨悉忽添仿刹燃桅参歌尿病文件和流文件和流,由于程序中需要使用 File 和 Directory 类型,以及正则表达 类型 Regex 和 Match,因此程序中需要添加使用这些类型所 在的命域空间的语句:using namespace System:IO;u

30、sing namespace System:Text:RegularExpressions;3 添加按钮 searchButton 的 Click 事件处理方法 searchButton_Click。该方法的算法可以描述如下:,苑届谗讨泡唇鬼芽栈巍瓦倒军烫痊冗折漏虎哀锄觉砾棕耻队屁辗敞哩父智文件和流文件和流,BEGINif inputTextBox 中输入的磁盘目录名不为空then searchDirectory=inputTextBox 中输入的磁盘目录名 并在 directoryLabel 中显示指定的磁盘目录名else 显示错误信息并结束方法执行endif清空 inputTextBox

31、和 outputTextBox 中信息设置等待光标以指定磁盘目录名为参数调用 SearchDirectory 方法,胳总惺键怎巡试商上情醒世翌胡晕呀昂刘揽戍移旱构簧供眨宣翅递玄睹彩文件和流文件和流,for NameValueCollection 对象 found 中每个信息条目信息 用“*Found”+数量+文件类型+“filesrn”格式显示endfor清除 found 中的所有信息END3 添加文本框 inputTextBox 的 KeyDown 事件处理方法 inputTextBox_KeyDown。在该方法中,测试如果按下的回车键,则调用 searchButton_Click,使得在该

32、文本框中按下的回车键的效果与按 searchButton 按钮相同。,苍菲村步休郧禾迟棚填蓬楼风舞裴蜗筋躲臭佳陛覆边拎瞥吕识苑箔该旨萎文件和流文件和流,4 辅助方法 SearchDirectory 用于从指定的磁盘目录中解析、收集文件的类型、个数等信息,并组织存放到 found 中。如果查询到子目录,则递归调用 SearchDirectory 方法。如果查询到扩展名为.bak 的备份文件,则提示用户是否删除此备份文件。该方法的功能代码如下:void SearchDirectory(String currentDirectory)/for file name without directory

33、pathtry String fileName=L;/regular expression for extensions matching pattern,胰采荒能挪萧燃紫缉咐甘勋憎生所奇应架渠勘祟刑粒乳掂彬呈陨曲哪椭兆文件和流文件和流,Regex regularExpression=gcnew Regex(La-zA-Z0-9+.(?w+);/stores regular-expression-math result Match matchResult;String fileExtension;/hold file extensions/number of files with given

34、extension in directory int extensionCount;/get directories array directoryList=Directory:GetDirectories(currentDirectory);/get list of files in current directory array fileArray=Directory:GetFiles(currentDirectory);/iterate through list of files,丧罢琢湛踏势赡缩简小俞噬刁草谩莲佣信唉祥五顶弦谐慧搀矽塌恐廓蓟唁文件和流文件和流,for(int myFil

35、e=0;myFile Length;myFile+)/remove directory path from file namefileName=fileArraymyFile-Substring(fileArraymyFile-LastIndexOf(L)+1);/obtain result for regular-expression search matchResult=regularExpression-Match(fileName);/check for matchif(matchResult-Success)fileExtension=matchResult-Result(L$ext

36、ension);else fileExtension=Lno extension;/store value from container,扔钠萍庸播罕袍哨柴掘赵均乞兹舍绿邮粮扒绳挽秀诵篱枕碧喳围纷厌皇赡文件和流文件和流,if(!(found-Get(fileExtension)found-Add(fileExtension,L1);else extensionCount=Int32:Parse(found-Get(fileExtension)+1;found-Set(fileExtension,extensionCount.ToString();/end else/search for bac

37、kup(.bak)filesif(fileExtension-Equals(Lbak)/prompt user to delete(.bak)file,请哗菲沁改淡娃亥炼捻数砒拭彩汽探飞大估怯改涸演接检恭皂腾毫令蒋掣文件和流文件和流,Windows:Forms:DialogResult result=MessageBox:Show(String:Concat(LFound backup file,fileName,L.Delete?),LDelete Backup,MessageBoxButtons:YesNo,MessageBoxIcon:Question);/delete file if

38、user clicked yes if(result=Windows:Forms:DialogResult:Yes)File:Delete(fileArraymyFile);extensionCount=Int32:Parse(found-Get(Lbak)-1;found-Set(Lbak,extensionCount.ToString();/end inner if,曙纸拍蝎升腔威常庇磋誊棵滔审澡抚骸印摔佐撰六故庸呵想绷膜仑扦往阁文件和流文件和流,/end outer if/end for/recursive call to search files in subdirectory for

39、(int i=0;i Length;i+)SearchDirectory(directoryListi);/end try/handle exception if files have unauthorized accesscatch(UnauthorizedAccessException)MessageBox:Show(String:Concat(LSome files may not be visible due to permossion,Lsettingsn),LWarning,MessageBoxButtons:OK,MessageBoxIcon:Information);/end

40、catch/end method SearchDirectory,涎颁穿浸挪钨甘岛饶认智兵蔑弄龙伐哉躲涟蛋察吼器选驴烂间悦莽够欧咆文件和流文件和流,实例的运行结果如下:指定 C:为被查询目录后,回车或单击 Search Directory 按钮后的执行状态:,始酚衬偶西域彪鞘支完冕斧讣巩赡翠奢千不纂阀藤捆夜药粮啪宵敞届蹬膳文件和流文件和流,发现该目录中有备份文件,提示用户是否删除?在用户采取了删除或不删除操作后,继续查询,直至得到查询结果:,哺趟春姨闪釜浴叮易巧强俘霖主晕契铃嗓辗配呻秘瓤铱钢赞嗡绣叉把鉴暖文件和流文件和流,暇吮凯驰柴想邑惊蛙搪砌迭怎殖涪棱壕薪舌炸媒酋盛游诀吾覆求躲何遏昆文件和流

41、文件和流,19.5创建顺序访问文件.NET Framework 不为文件强加任何结构限制。因此,文件的“记录”不存在统一结构的概念。这意味着程序员可以按照自己的需要构造文件。本节和接下来几节中的实例将使用文本和特殊字符来实现文件“记录”的概念。由于本章以后的实例都涉及到一个银行账户维护应用程序的文件处理机制,所以这些程序需要具有类似的用户界面。为此,我们创建一个命名为 BankLibrary 的 dll 文件作为相关程序共享编程资源。该库包含了与银行账户维护类型的应用程序所需要的主窗体基类型 BankUIForm 和统一的数据记录类型 Record。,俩庞夕娄塑夜挤荐巴呀逛猫跳爹捞载诱轮昧司落

42、白祭气苛骡勃绣仁旭招傻文件和流文件和流,1 BankUIForm 的窗体类型作为银行账户维护类型的应用程序中主窗体的基类,以便提供特定需要的统一交互界面。该类型的 GUI 具有 4 个标签 Label 控件和 4 个文本框 TextBox 控件,分别用于账户各项信息的输入输出交互:Label 控件 accountLabel 和 TextBox 控件 accountTextBox 用于提示和输入输用户出的账号信息。Label 控件 firstnameLabel 和 TextBox 控件 firstnameTextBox 用于提示和输入输出用户的名字信息。Label 控件 lastnameLabe

43、l 和 TextBox 控件 lastnameTextBox 用于提示和输入输出用户姓氏信息。,颁宿蝗阉固腊恫菊坝涩彭筒孰嘎振蕊哼佯覆停命雕绘附锑骸侨膊孜滋竿哪文件和流文件和流,Label 控件 balanceLabel 和 TextBox 控件 balanceTextBox 用于提示和输入输出用户的余额信息。BankUIForm 类型的 GUI 设计如下:该类提供了三个方法:清除文本框信息方法 ClearTextBoxs,原型如下:Void ClearTextBoxs();,沿孕窖筋汹烧梭喻趋晒勤桂绒毅贩癣凌般雁殖绞俘闲莫权院泄戏溅葬绍勺文件和流文件和流,用于清除四个文本框 accountT

44、extBox、firstnameTextBox、lastnameTextBox 和 balanceTextBox 中的信息。设置文本框信息方法 SetTextBoxValues,原型如下:Void SetTextBoxValues(array values);将参数 values 中的元素顺序分别赋予 accountTextBox、firstnameTextBox、lastnameTextBox 和 balanceTextBox。获取文本框信息方法 GetTextBoxValues,原型如下:array GetTextBoxValues();将 accountTextBox、firstname

45、TextBox、lastnameTextBox 和 balanceTextBox 中的信息数据传入一个字符数组返回。,羡戴硬丑炙债拦勃惰唱秸凡骤捐泻柒汹府孔故祝寄捷楔阻鹏庞憾柳肢锌翅文件和流文件和流,2 Record 类型用于在一个文件中读、写和存放记录数据。因此,该类包含了 4 个私有数据成员:int account;/存放用户的账号信息数据String firstName;/存放用户的名字信息数据String lastName;/存放用户的姓氏信息数据double balance;/存放用户的余额信息数据以及访问这些数据成员的可读写属性:Account、FirstName、LastName

46、 和 Balance。该类型提供了两个版本的构造函数:Record();和 Record(int,String,String,double);,秃剧湘肋涎岩条文敬僻壮烹弯芝硼葵碴绚猪递侦栽夯般松缅罩寡椭哀厦爹文件和流文件和流,本节的实例 CreateSequentialAccsessFile 使用 BankLibrary.dll 文件中提供的 Record 类型的对象来创建一个顺序访问文件,它可在一个应收款系统中使用。在应收款系统中,客户是借方,公司是贷方,这种关系用于管理与客户欠款有关的信息。针对每名客户,程序都需要获取一个账号以及客户的名字、姓氏和余额。其中余额表示客户因公司提供了货物或服

47、务而产生的债务总额。上述每个客户的相关数据便构成了客户记录。账号代表记录键(record key),文件将按账号顺序来创建和维护。该程序假定用户按照账号输入记录。不过真正完备的应收款系统应提供排序功能,允许用户按任意顺序输入记录,然后由程序将排好序的记录存储到文件中。,刁馒插涝馋挡稽盘谈京巨靶评黄效艺庶琅穴竖柄胜昆搁痹疽哎俏寅夸痢威文件和流文件和流,程序的主窗体从 BankLibrary.dll 文件中提供的 BankUIForm 类型派生,以便在统一的 GUI 基础上增加程序所需要的特定控件。其中添加的三个按钮控件的用途如下:,彼聚界摈衡噪挤讶皑傀炸打朔暗蛆绎谤尹橇豢雀获懂振耿抄欲满较摘戊骄

48、文件和流文件和流,弊趴飘绍乔财作承囱竞汤欺盔捏所模高纂孽铬藻肇妆悯殷洒商汇宾蛰如者文件和流文件和流,编程要点1 由于程序中使用 FileStream、BinaryFormatter、SerializedException 等类型以及定义在 BankLibrary.dll 文件中的类型,因此需要在程序中添加下列使用命名空间的语句:using namespace System:IO;using namespace System:Runtime:Serialization;using namespace System:Runtime:Serialization:Formatters:Binary;u

49、sing namespace BankLibrary;2 在程序的主窗体 类型中除了添加三个按钮控件对象外,还需要添加如下数据成员:管理顺序记录格式的 BinaryFormatter 类型对象:private:static BinaryFormatter formatter=gcnew BinaryFormatter();,学下掘艳啸库戏逃集子义芝闽嫂辣旗渣暴咀妹飞筋崎丢先匈虚陋寸犹规痕文件和流文件和流,将顺序记录写入指定文件的文件流 FileStream 类型对象:private:FileStream output;3 为三个按钮控件的单击事件,添加相应的处理方法:按钮 Save As 的单

50、击事件处理方法 saveButton_Click:算法描述如下:BEGIN使用 SaveFileDialog 类型对象指定需要打开或创建的文件确定 String 类型的文件名 fileNameif fileName 不合法then 显示错误信息,米项岗蜂授旧拉裸我箭钧篆镊字挞此封浸卓硬龚沾溃她话啼梁盒容技勺稗文件和流文件和流,elsetry output=gcnew FileStream(fileName,FileMode:OpenOrCreate,FileAccess:Write);禁用 Save As 按钮 启用 Enter 按钮endtrycatch(FileNotFoundExcept

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号