<4D F736F F D E466F726DB3CCD0F2C9E8BCC6D3EBCAB5BCF920B5DA35D5C22E646F63>

Similar documents
目录 1 文件操作之一 版权声明 内容详情 追加文件 拷贝文件 删除文件 移动文件 创建目录 文件夹内容拷贝 文件夹内容删除..

第7章 目录和文件操作

《linux从入门到精通》实验指导第三讲:文件及目录操作

Microsoft PowerPoint - 06.ppt

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

untitled

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS

while ((ch = fr.read())!= -1) { System.out.print((char) ch); fr.close(); 例 3: 用 BufferedReader 读 TXT 文件 public class FileReaderDemo3 { public static v

untitled

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

Guava学习之Resources

C#程序设计实验

Microsoft Word - 新正文.doc

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft Word - 第3章.doc

Linux服务器构建与运维管理

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

untitled

untitled

CHAPTER 1

Microsoft Word - 实验3.doc

IsPostBack 2

Microsoft Word - 新1-12.doc

untitled

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

CHAPTER VC#

第7章 数组

文件

untitled

无类继承.key

untitled

untitled

MVB-1001.DOC

PowerPoint 演示文稿

ExcelUtility 类库使用说明 ( 续 ) 开发 / 设计 : 左文俊 第一个新增功能, 列宽自适应, 当超过 30 个字符则将单元格内容设为换行 任意一个无模板的导出方法均支持该功能, 示例代码如下 : /// <summary> /// 测试方法

untitled

基于ECO的UML模型驱动的数据库应用开发1.doc

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

Linux 操作系统与程序开发环境 卢脁 Parallel Computing WHY Linux 的安装 系统管理 linux 的基本命令与概念 Linux 操作系统与程序开发环境 Linux Operating System and Programming Environment 卢脁 Depa

《C语言程序设计》教材习题参考答案

Microsoft PowerPoint - CPP-Ch Print.ppt [兼容模式]

Guava学习之CharSequenceReader

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

教案模板4-2

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

《计算概论》课程 第十九讲 C 程序设计语言应用

软件工程文档编制

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

<4D F736F F D205BCAE9B0FCCDF85DC8FDC9FAC8FDCAC0CAAEC0EFCCD2BBA82E646F6378>

《C语言程序设计》第2版教材习题参考答案

Converting image (bmp/jpg) file into binary format


Microsoft Word - 实验3.doc

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

基于 SIMATIC IOT2040 的 Node-red S7 通信 1. 主要目标 基于 Node-red S7 通信, 实现 SIMATIC IOT2040 读写 Siemens S7-300/400/1200/1500 或 S7-200 Smart PLC 中的数据 2. Node-red

untitled

新・解きながら学ぶJava

Microsoft Word - AccessPortal使用手册v3.1.doc

Microsoft Word - VB全文.doc

epub83-1

untitled

第一章 章标题-F2 上空24,下空24

Apache CarbonData集群模式使用指南

第十一章 文件和数据的导入与导出

附件一:

untitled

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

C/C++ - 文件IO

全国计算机技术与软件专业技术资格(水平)考试

手册 doc

File No. No. 2 No. 3 File No. CONFIDENTIAL 4 7 Chapter Chapter Chapter 3 3.

untitled

Microsoft Word - ch04三校.doc

07-form

Parallel Computing WHY Linux 的安装系统管理 linux 的基本命令与概念 Linux 操作系统与程序开发环境 Linux 操作系统与程序开发环境 卢脁 Parallel Computing Linux 操作系统与程序开发环境 卢脁 Linux Operating Sys

Microsoft Word - 2AF63內文.doc

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

PowerPoint Presentation

Microsoft Word - 2B802內文.doc

東區校園中法治教育種子師資教學研習營

閱 讀 素 材 V.S 分 組 方 式 的 差 異 化 教 學 工 具 表 班 級 :( ) 閱 讀 素 材 V.S 分 組 方 式 獨 立 閱 讀 夥 伴 閱 讀 ( 同 質 性 ) 夥 伴 閱 讀 ( 異 質 性 ) 友 善 陪 伴 虛 心 受 教 國 語 日 報 新 聞 生 活 文 藝 兒 童

Microsoft Word - 1HF12序.doc

Microsoft Word - 讀報看科普─人體篇_橫_.doc

鍟嗗搧瑙傚療鈥㈤挗鏉

席 远 杨 一 人 了, 正 当 她 开 枪 时 却 发 现 子 弹 没 了 该 死, 只 能 赤 手 空 拳 了 洛 水 云 与 席 远 杨 交 起 手 来, 洛 水 云 出 手 招 招 致 命 想 那 席 远 杨 也 不 是 泛 泛 之 辈, 很 快 掌 握 了 洛 水 云 出 招 路 数 看

0 配置 Host MIB 设备 V ( 简体版 ) 0 Update: 2016/1/30

PowerPoint 演示文稿

Visual Basic D 3D

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

使用Apache Beam读写HDFS上的文件

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

<4D F736F F D B3CCD0F2C9E8BCC6A1AAA1AA E4E4554C9CFBBFACAB5D1E9D6B8B5BCA3A8B5DA33B0E6A3A9CEA2BFCEB0E620CAB5D1E9352E646

Microsoft PowerPoint - string_kruse [兼容模式]

云数据库 RDS SDK

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Transcription:

第 5 章 输入与输出 学习目标 : 理解文件与流的基本概念 ; 了解文件与目录的基本知识及其常用的类 ; 掌握文件流读写方法 5.1 概述 文件是计算机管理数据的基本单位, 同时也是应用程序保存和读取数据的一个重要场所 C# 中文件处理技术称为 I/O 技术, 即输入与输出技术, 或称为流处理技术或文件流处理技术 5.1.1 文件与流 文件和流是既有区别又有联系的两个概念 文件是指在各种存储介质上永久保存数据的有序集合, 并与一个具体的名称对应, 它是进行文件读写操作的基本对象 从严格意义上讲, 文件指的是放在磁盘上的静态信息, 这种信息不是连续的, 是随机的 流是字节序列的抽象概念, 流提供一种向后续存储器写入字节或从后续存储器读取字节的方法 流一般指的是连续的字节信息 例如, 要对一个文件进行处理, 这个文件就会变成连续的字节信息加载到内存中, 也就是说文件在处理时就必须变成流 流强调的是动态的连续信息, 是由文件转换成的 流和文件指的都是一件事物, 但是状态不一样 文件是存储在存储介质上的数据集, 是静态的, 具有名称和相应路径 当打开一个文件并对其进行读写时, 该文件就成为流 5.1.2 System.IO 命名空间 System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型, 因此在使用这些类时需要引入 System.IO 命名空间 System.IO 命名空间中的常用类如表 5-1 所示 System.IO 命名空间中的常用类大致分为操作目录的类 操作文件的类 文件读写类等 其中,Directory 类和 DirectoryInfo 类属于操作目录的类 ;File 类和 FileInfo 类属于操作文件的类,StreamReader 类和 StreamWriter 类属于文本文件读写的类 ;BinaryReader 类和 BinaryWriter 类属于二进制文件读写的类

表 5-1 System.IO 命名空间的类 类 名 功能和用途 Directory DirectoryInfo 创建 删除并移动目录, 通过属性获取特定目录的相关信息 File FileInfo 创建 删除并移动文件, 通过属性获取特定文件的相关信息 StreamReader StreamWriter 读写文本数据信息 BinaryReader BinaryWriter 读写二进制数据 5.2 目录操作 在程序开发中, 有时需要对文件目录进行操作, 如创建目录 删除目录等, 为此 C# 提供了 Directory 类和 DirectoryInfo 类 5.2.1 Directory 类 Directory 类是静态类, 提供了许多静态方法用于对目录进行操作, 如创建 删除和移 动目录等 Directory 类的一些常用方法如表 5-2 所示 表 5-2 Directory 类的常用方法 方 法 说 明 CreateDirectory() 创建指定路径的目录 Exists() 判断目录是否存在 GetDirectoryRoot() 获取指定目录的根目录 GetDirectories() 获取当前目录下的 Directory 对象数组 GetFiles() 获取当前目录下的 File 对象数组 Delete() 删除指定目录及其目录下的所有文件 Move() 将指定目录移动到新的位置 注意 :Directory 的 Delete() 方法是永久删除, 不把目录送到回收站 ; 使用 Move() 方法 移动目录时, 要注意不能跨磁盘移动, 如 C 盘的文件不能移到 D 盘下 例 5-1 目录创建程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 DirectoryApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 1 个 Label 控件 1 个 Box 控件和 1 个 Button 控件到窗体设计区, 并调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-3 列出了窗体及控件属性 表 5-3 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 创建目录 label1 请输入创建目录名称 : textbox1 txtdir button1 btnmake 创建 147 第 5 章科输入与输出

WinForm 程序设计与实践 (4) 双击 创建 按钮, 为其添加单击事件处理程序, 程序代码如下 : 148 private void btnmake_click(object sender, EventArgs e) string path = txtdir.; if (Directory.Exists(path)) MessageBox.Show (path + " 目录已经存在 "); else Directory.CreateDirectory(path); MessageBox.Show(path + " 目录创建成功 "); 以上代码的功能是, 首先定义一个 string 类型的变量 path 保存用户输入的目录, 然后调用 Directory 类的 Exists() 方法查找该目录是否存在,Exists() 方法的参数是用户输入的目录, 即变量 path, 如果存在, 提示 目录已经存在 ; 如果不存在, 则调用 Directory 类的 CreateDirectory() 方法创建该目录, 并提示 目录创建成功 (5) 在解决方案资源管理器中右击 DirectoryApplication 项目, 将其设为启动项目 (6) 编译并运行, 运行结果如图 5-1 所示 图 5-1 DirectoryApplication 项目运行结果 5.2.2 DirectoryInfo 类 DirectoryInfo 类的功能与 Directory 类相似, 不同的是的 DirectoryInfo 类是一个实例类, 所有方法都是实例方法 也就是说, 要想使用 DirectoryInfo 类提供的方法必须实例化一个属于 DirectoryInfo 类的对象 因此, 如果需要对同一个目录进行多次重复操作时, 应该考虑使用 DirectoryInfo 类的实例方法 DirectoryInfo 类不仅拥有与 Directory 类功能相似的方法, 而且还具有一些特有的属性, 如表 5-4 所示 表 5-4 DirectoryInfo 类的常用属性 Root Parent Full Exists 属 性 说 明 获取当前 DirectoryInfo 对象的名称 获取路径的根目录 获取指定子目录的父目录 获取目录或文件的完整目录 判断指定目录是否存在

例 5-2 目录浏览程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 DirectoryInfoApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 2 个 GroupBox 控件 4 个 Label 控件 4 个 Box 控件 1 个 ListBox 控件和 1 个 Button 控件到窗体设计区, 调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-5 列出了窗体及控件属性 表 5-5 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 浏览目录 label1 请输入目录名称 : textbox1 txtdir label2 目录名称 : textbox2 txt label3 根目录名称 : textbox3 txtroot label4 父目录名称 : textbox4 txtparent groupbox1 详细信息 groupbox2 目录列表 button1 btnbrowse 浏览 listbox1 listgetdirectories (4) 定义一个 dirlist() 方法, 用于在列表框中循环输出指定目录中的所有子目录 public void dirlist(directoryinfo dir) listgetdirectories.items.clear(); DirectoryInfo[] dirs = dir.getdirectories(); for (int i = 0; i < dirs.length; i++) listgetdirectories.items.add(dirs[i]); 以上代码的功能是, 封装一个 dirlist() 方法, 该方法没有返回值, 有一个 DirectoryInfo 类型的参数, 方法体中首先清空列表框, 并通过 DirectoryInfo 对象的 GetDirectories() 方法获得目录中的所有子目录, 所有子目录构成一个 DirectoryInfo 类型的数组, 然后在列表框中循环输出该数组中的每一个元素的值 (5) 双击 浏览 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnbrowse_click(object sender, EventArgs e) 149 第 5 章 科输入与输出

WinForm 程序设计与实践 150 string path = txtdir.; if (!string.isnullorempty(path)) DirectoryInfo dir = new DirectoryInfo(path); txt. = dir.; txtroot. = dir.root.tostring(); txtparent. = dir.parent.tostring(); // 输出子目录 dirlist(dir); else MessageBox.Show(" 请输入目录名称!"); 以上代码的功能是, 首先定义一个 string 类型的变量 path, 用来存储用户输入的目录, 然后通过调用 string 的 IsNullOrEmpty() 方法判断 path 值是否为空, 即判断用户是否已输入目录名称, 如果不为空, 则创建该目录的 DirectoryInfo 对象, 并在相应文本框中输出用户指定目录的名称 根目录名称 父目录名称, 通过调用步骤 (4) 中封装的 dirlist() 方法输出所有子目录 (6) 在解决方案资源管理器中右击 DirectoryInfoApplication 项目, 将其设为启动项目 (7) 编译并运行, 运行结果如图 5-2 所示 图 5-2 DirectoryInfoApplication 项目运行结果

5.3 文件操作 File 类和 FileInfo 类主要提供与文件有关的各种操作, 包括创建 复制 移动 删除文件等 5.3.1 File 类 File 类是一个静态类, 提供了许多静态方法, 用于处理文件 File 类的常用方法如 表 5-6 所示 表 5-6 File 类的常用方法 方 法 说 明 Create() 创建文件 Open() 打开指定路径上的文件, 返回 FileStream 对象 Copy() 将文件复制到指定位置 Move() 将指定文件移动到新位置 Delete() 删除文件 Exists() 判断指定文件是否存在 注意 :Directory 和 File 提供的方法都是共享方法, 如果执行一次操作, 使用共享方法 的效率较高 ; 但如果针对一个目录或文件多次操作, 可以考虑使用 DirectoryInfo 和 FileInfo 提供的实例方法 例 5-3 文件删除程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 FileApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 1 个 Label 控件 1 个 Box 控件和 1 个 Button 控件到窗体设计区, 并调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-7 列出了窗体及控件属性 表 5-7 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 删除文件 label1 请输入删除文件名称 : textbox1 txtdir button1 btndelete 删除 (4) 双击 删除 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btndelete_click(object sender, EventArgs e) string path = txtdir.; 151 第 5 章 科输入与输出

WinForm 程序设计与实践 152 if (File.Exists(path)) File.Delete(path); MessageBox.Show(" 文件删除完毕!"); else Console.WriteLine(" 文件不存在!"); 以上代码功能是, 通过 File 类的 Exists() 方法判断用户输入的文件是否存在, 如果存在, 通过调用 File 类的 Delete() 方法删除该文件, 并提示用户 文件删除完毕! ; 如果不存在, 提示 文件不存在! (5) 在解决方案资源管理器中右击 FileApplication 项目, 将其设为启动项目 (6) 编译并运行, 运行结果如图 5-3 所示 5.3.2 FileInfo 类 图 5-3 FileApplication 项目运行结果 FileInfo 类与 File 类类似, 它们都可以对磁盘上的文件进行操作 不同的是 FileInfo 类是实例类, 所有的方法必须实例化对象后才能调用 FileInfo 类除了拥有与 File 类相似的方法外, 同时也有它特有的属性, 如表 5-8 所示 表 5-8 FileInfo 类的常用属性属性说明 Directory 获取父目录的实例 Directory 获取表示目录的完整路径的字符串 Full 获取目录或文件的完整目录 Length 获取当前文件的大小 例 5-4 文件浏览程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 FileInfoApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 1 个 GroupBox 控件 3 个 Label 控件 3 个 Box 控件和 1 个 Button 控件到窗体设计区, 调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-9 列出了窗体及控件属性

表 5-9 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 浏览文件 label1 请输入文件名称 : textbox1 txtfile label2 文件当前目录 : textbox2 txtdir label3 文件大小 : textbox4 txtsize groupbox1 详细信息 button1 btnbrowse 浏览 (4) 双击 浏览 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnbrowse_click(object sender, EventArgs e) FileInfo file = new FileInfo(txtFile.); if (file.exists) txtdir. = file.directory.tostring(); txtsize. = file.length.tostring(); else file.create(); MessageBox.Show (" 文件已经创建成功!"); 以上代码的功能是, 首先创建 FileInfo 类的对象 file,fileinfo 类的构造方法中有一个参数, 即用户输入的文件名, 通过调用对象 file 的 Exists 属性判断该文件是否存在, 如果用户指定的文件存在, 则输出文件的当前目录和文件大小 ; 如果文件不存在, 则通过调用对象的 Create() 方法创建该文件, 并提示 文件已经创建成功! (5) 在解决方案资源管理器中右击 FileInfoApplication 项目, 将其设为启动项目 (6) 编译并运行, 运行结果如图 5-4 所示 153 图 5-4 FileInfoApplication 项目运行结果 第 5 章科输入与输出

WinForm 程序设计与实践 5.4 文件读写 154 数据流 ( 也称为流 ) 是一个用于传输数据的对象 数据的传输有两个方向, 如果数据是从外部源传输到程序中, 就称为读取流 ; 如果数据是从程序传输到外部源, 就称为写入流 在 System.IO 命名空间中, 对文件的读写操作是依靠流操作进行的 也就是说.NET 中一个被打开的文件就是一个数据流, 对已经打开的文件进行读写操作就是在对内存中的一个数据流进行读写操作 5.4.1 读写文本文件 文本文件是一种纯文本数据构成的文件 实际上, 文本文件只保存了字符的编码.NET Framework 支持多种编码, 包括 ASCII UTF7 UTF8 Unicode UTF32 等 在.NET Framework 中, 读写文本文件可以使用流读取器 StreamReader 和流写入器 StreamWriter 1.StreamReader 类 StreamReader 类用于从文件中读取数据, 该类是一个通用类, 可用于任何流 Stream Reader 类以一种特定的编码输入字符, 默认的编码为 UTF8,UTF8 可以正确处理 Unicode 字符并在操作系统的本地化版本上提供一致的结果 StreamReader 类的常用方法如表 5-10 所示 表 5-10 StreamReader 类的常用方法 方 法 说 明 Close() 关闭 StreamReader 对象和基础流 Dispose() 释放所有 StreamReader 对象资源 Peek() 返回下一个可用的字符 Read() 读取输入流中的下一个字符或下一组字符 ReadLine() 从数据流中读取一行数据, 并作为字符串返回 ReadToEnd() 从流的当前位置到末尾读取流 2.StreamWriter 类 StreamWriter 类用于将字符和字符串写入文件, 它实际上也是先转换成 FileStream 对 象, 然后向文件中写入数据的, 所以在创建对象时可以通过 FileStream 对象来创建 StreamWriter 对象, 同时也可以直接创建 StreamWriter 对象 StreamWriter 默认使用 UTF8 编码 StreamWriter 类的常用方法如表 5-11 所示 表 5-11 StreamWriter 类的常用方法 方 法 说 明 Close() 关闭 StreamWriter 对象和基础流 Dispose() 释放所有 StreamWriter 对象资源 Flush() 清理当前编写器的所有缓冲区, 并使所有缓冲数据写入基础流 Write() 写入流 WriteLine() 写入指定的某些数据, 后跟行结束符

例 5-5 简单日志程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 StreamApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 2 个 Label 2 个 Box 控件 和 2 个 Button 控件到窗体设计区, 调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-12 列出了窗体及控件属性 表 5-12 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 简单日志 label1 请输入日志内容 : textbox1 txtsource MultiLine true label2 已有的日志内容 : txtshow textbox2 MultiLine true ReadOnly true button1 btnsave 保存 button2 btnshow 显示 (4) 双击 保存 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnsave_click(object sender, EventArgs e) StreamWriter writer = new StreamWriter(@"D:\ 示例代码 \chapter05\ 日志.txt",true); writer.writeline(datetime.now.tostring ()); writer.writeline(txtsource. ); writer.close(); MessageBox.Show(" 日志保存成功!"); 以上代码的功能是, 在保存日志时, 首先利用 StreamWriter 类的构造方法创建流写入 器对象, 构造方法的第 1 个参数表示文件名的路径 ; 第 2 个参数表示是否添加新内容, 如 果设置为 false, 将覆盖原有内容 然后调用 WriteLine() 方法把日志内容写入文件 (5) 双击 显示 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnshow_click(object sender, EventArgs e) StreamReader reader = new StreamReader(@"D:\ 示例代码 \chapter05\ 日志.txt"); txtshow. = reader.readtoend(); reader.close(); 155 第 5 章 科输入与输出

WinForm 程序设计与实践 156 以上代码的功能是, 在读取日志内容时, 首先利用 StreamReader 类的构造方法创建读取流的读取器对象, 同时打开磁盘文件, 接着调用 ReadToEnd() 方法, 把文件内容全部读出, 返回的字符串通过文本框输出 (6) 在解决方案资源管理器中右击 StreamApplication 项目, 将其设为启动项目 (7) 编译并运行, 运行结果如图 5-5 所示 图 5-5 StreamApplication 项目运行结果 5.4.2 读写二进制文件 在.NET Framework 中, 读写二进制文件可以使用流读取器 BinaryReader 和流写入器 BinaryWriter 二进制文件是以二进制代码形式存储的文件, 数据存储为字节序列 二进制文件可以包含图像 声音 文本或编译之后的程序代码 C# 的 FileStream 类提供了最原始的字节级上的文件读写功能, 但编程中经常会对字符串操作, 于是 StreamWriter 类和 StreamReader 类增强了 FileStream 类, 它可以在字符串级别上操作文件 但有时还是需要在字节级上操作文件, 却又不是一个字节一个字节地操作, 通常是 2 个 4 个或 8 个字节操作, 这便有了 BinaryWriter 和 BinaryReader 类, 它们可以将一个字符或数字按指定个数字节写入, 也可以一次读取指定字节转为字符或数字 1.BinaryReader 类 BinaryReader 类用特定的编码将基元数据类型读作二进制值, 其常用方法如表 5-13 所示 表 5-13 BinaryReader 类的常用方法 方 法 说 明 Close() 关闭 BinaryReader 对象和基础流 Dispose() 释放 BinaryReader 类当前实例所使用的所有资源 PeekChar() 返回下一个可用的字符, 并且不提升字节或字符的位置 Read() 从基础流中读取字符, 并根据所使用的 Encoding 和从流中读取的特定字符, 提升流的当前位置 ReadByte() ReadString() 从当前流中读取下一个字节, 并使流的当前位置提升一个字节 从当前流中读取一个字符串 字符串有长度前缀, 一次 7 位地被编码为整数

2.BinaryWriter 类 BinaryWriter 类以二进制形式将基元类型写入流, 并支持用特定的编码写入字符串, 其常用方法如表 5-14 所示 表 5-14 BinaryWriter 类的常用方法 方 法 说 明 Close() 关闭当前 BinaryWriter 和基础流 Dispose() 释放 BinaryWriter 类当前实例所使用的所有资源 ToString() 返回表示当前对象的字符串 Write() 将值写入当前流 例 5-6 简单学生管理程序 操作步骤 (1) 启动 VS, 新建一个 Windows 窗体应用程序 BinaryApplication (2) 双击 Form1.cs, 切换到设计视图, 从工具栏中拖曳 3 个 Label 2 个 Box 控件 2 个 RadioButton 1 个 ListBox 和 2 个 Button 控件到窗体设计区, 调整控件大小进行布局 (3) 在窗体设计区中右击窗体 Form1 和每一个控件, 设置窗体和控件的相关属性 表 5-15 列出了窗体及控件属性 表 5-15 窗体及控件属性设置 窗体和控件 属 性 属性值 Form1 学生信息管理 label1 学号 : textbox1 txtnum label2 姓名 : textbox2 txt label3 性别 : radiobutton1 radiobutton2 rdbmale 男 rdbfemale 女 listbox1 listshow button1 button2 btnsave 保存 btnshow 显示 (4) 双击 保存 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnsave_click(object sender, EventArgs e) FileStream fs = new FileStream(@"D:\ 示例代码 \chapter05\student.dat", FileMode.Append,FileAccess.Write ); // 通过文件流写文件 BinaryWriter writer = new BinaryWriter(fs); 157 第 5 章 科输入与输出

WinForm 程序设计与实践 158 // 写入一个整数 writer.write(int32.parse (txtnum. )); // 写入一个字符串 writer.write(txt.); bool ismale; if (rdbmale.checked) ismale = true; else ismale = false; // 写入一个 bool 值 writer.write(ismale); fs.close(); writer.close(); 以上代码的功能是, 在保存数据时, 首先利用 FileStream 类的构造方法创建一个文件流对象, 该构造方法有 3 个参数, 第 1 个参数表示要操作的文件名 ; 第 2 个参数是文件模式,FileMode.Append 表示打开现有文件并查找到文件尾, 如果文件不存在, 则创建该文件 ; 第 3 个参数是文件操作模式,FileAccess.Write 表示写文件 然后通过文件流对象创建 BinaryWriter 写入器对象, 并连续调用写入器对象的 Write() 方法把数据写入文件流 (5) 双击 显示 按钮, 为其添加单击事件处理程序, 程序代码如下 : private void btnshow_click(object sender, EventArgs e) listshow.items.clear(); listshow.items.add(" 学号 \t 姓名 \t 性别 "); FileStream fs = new FileStream(@"D:\ 示例代码 \chapter05\student.dat", FileMode.Open,FileAccess.Read ); // 通过文件流读文件 BinaryReader reader = new BinaryReader(fs); fs.position = 0; while (fs.position!=fs.length ) // 读出一个整数 int num = reader.readint32(); // 读出一个字符串 string name = reader.readstring(); string sex = ""; // 读出一个 bool 值 if (reader.readboolean())

sex = " 男 "; else sex = " 女 "; string result = string.format("0\t1\t2", num, name, sex); listshow.items.add(result); reader.close(); fs.close(); 以上代码的功能是, 在显示数据时, 首先创建文件流对象, 并指定操作方式为打开 (FileMode.Open) 和读取文件 (FileAccess.Read), 然后通过文件流对象创建 BinaryReader 读取器对象, 并使用读取器对象从头至尾循环读取文件流, 最终把读出来的数据添加到列表框中输出 (6) 在解决方案资源管理器中右击 BinaryApplication 项目, 将其设为启动项目 (7) 编译并运行, 运行结果如图 5-6 所示 图 5-6 BinaryApplication 项目运行结果 5.5 习题 1. 填空题 (1) 在 C# 中, 对文件操作的类都位于 命名空间中 (2) 利用 Directory 类的 方法可以获取指定目录中的子目录的名称 (3) 可以使用 DirectoryInfo 类的 属性获取指定子目录的父目录 (4) 对文件进行读操作可以使用 对象 (5) 数据流是一个用于 的对象 数据的传输有两个方向, 如果是数据从外部 源传输到程序中, 就称为 ; 如果是数据从程序传输到外部源, 就称为 159 第 5 章 科输入与输出

WinForm 程序设计与实践 160 2. 选择题 (1)Directory 类 ( ) 方法用于获取目录中所有文件名 A.GetDirectories() B.GetAllFiles() C.GetAllFiles() D.GetFiles() (2)FIleStream 类在 ( ) 命名空间中 A.System.IO B.System.Data C.System.File D.System.Stream 3. 程序设计题 接收 10 个数, 保存到二进制文件中, 然后读出显示在文本框中