




免费预览已结束,剩余37页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC中的文件操作 第10章 主要内容 10 1MFC中的文件操作 使用VisualC 进行程序设计时 进行文件操作可以用以下方法 1 使用标准C运行库函数 包括fopen fclose fseek等 2 使用Win16下的文件和目录操作函数 如lopen lclose lseek等 这些函数主要是为了向后兼容而保留的 不建议使用 3 使用Win32下的文件和目录操作函数 如CreateFile CopyFile DeleteFile FindNextFile等 10 1MFC中的文件操作 4 使用CFile及其派生类进行文件操作 CFile是从CObject派生的 其派生类包括操作文本文件的CStdioFile 操作内存文件的CMemFile等 本章的文件操作主要介绍MFC的标准文件访问方式 也就是CFile及其派生类的应用 10 1MFC中的文件操作 在Windows环境下 打开和创建文件都是由CreateFile函数完成的 操作成功时 返回一个Windows下的句柄 关闭文件使用Windows的CloseHandle函数 不同于 C 的fopen返回的句柄 在16位Windows环境下 该句柄和C运行库文件操作函数兼容 但是在32位以后的Windows版本中 C 的文件操作函数不能使用该句柄 如果需要 可以使用函数 open osfhandle将32位Windows句柄转换成一个 C 文件函数使用的文件句柄 10 1MFC中的文件操作 CFile是建立在32位Windows文件操作体系之上 封装了部分Windows文件操作函数 在Windows环境下 使用CFile及其或派生类的对象来操作文件 当然也可以从这些类派生自己的文件操作类 建议使用统一的CFile接口 可以提高程序的移植性 MFC用类封装了文件操作函数 并且以CFile为基础 派生了几个常用类 如CStdioFile CMemFile等 10 2文件类CFile和CStdioFile 10 2 1CFile类 CFile类定义了一些和文件操作相关的枚举类型常量 经常用到的有4种 OpenFlags Attribute SeekPosition hFileNull 10 2 1CFile类 1 OpenFlags OpenFlags定义了13种文件访问与共享模式 2 Attribute Attribute定义了文件的属性 分别为正常 只读 隐含 系统 卷或者目录等 3 SeekPosition SeekPosition定义了三种文件位置 头 尾 当前 4 hFileNull hFileNull定义了空文件句柄 10 2 1CFile类 CFile除了定义枚举类型外 还定义了一些成员变量 如 UINTm hFile BOOLm bCloseOnDelete CStringm strFileName 第1个成员变量是public访问权限 保存CreateFile函数返回的文件句柄 MFC重载了运算符号HFILE来返回m hFile 这样在使用HFILE类型变量时 就可以使用CFile对象 后两个成员变量是protected访问权限 m bCloseOnDelete用来指示是否在关闭文件时删除CFile对象 m strFileName用来保存文件名 10 2 2CFile的成员函数 CFile的成员函数是对Windows文件操作函数的封装 如打开 创建 关闭文件 文件指针定位 文件的锁定与解锁 文件状态的读取和修改等 其中用到m hFile文件句柄的一般都是虚函数 和此无关的一般是静态成员函数 大部分成员函数都被映射到了对应的WindowsAPI函数 如表10 1所示 10 2 2CFile的成员函数 表10 1CFile成员函数对Windows文件函数的封装 表10 1CFile成员函数对Windows文件函数的封装 10 2 2CFile的成员函数 表10 1CFile成员函数对Windows文件函数的封装 10 2 2CFile的成员函数 CFile类的构造函数和文件打开与创建的过程1 构造函数CFile Cfile 缺省构造函数 仅构造一个CFile对象 使用时还必须用Open函数打开文件 CFile inthFile 如果已经打开了一个文件hFile 在此基础上构造一个CFile对象 hFile被赋值给CFile的成员变量m hFile CFile LPCTSTRlpszFileName UINTnOpenFlags 通过指定文件名和文件打开方式构造CFile对象 在构造函数内部调用Open打开或者创建文件 并且把文件句柄保存到m hFile 10 2 2CFile的成员函数 2 打开 创建文件Open函数的原型如下 BOOLCFile Open LPCTSTRlpszFileName UINTnOpenFlags CFileException pException Open函数内部调用WindowsAPI函数 CreateFile打开文件 并把文件句柄保存到成员变量m hFile中 10 2 2CFile的成员函数 CreateFile函数的原型如下 HANDLECreateFile LPCTSTRlpFileName DWORDdwDesiredAccess DWORDdwShareMode LPSECURITY ATTRIBUTESlpSecurityAttributes DWORDdwCreationDistribution DWORDdwFlagsAndAttributes HANDLEhTemplateFile 10 2 2CFile的成员函数 很显然 Open函数必须把自己的两个参数lpszFileName和nOpenFlags映射到CreateFile的七个参数上 从OpenFlags的定义可以看出 其映射方法如下 1 nOpenFlags 3 表示读写标识 映射到变量dwAccess 取值为枚举类型的GENERIC READ GENERIC WRITE GENERIC READ GENERIC WRITE 2 nOpenFlags 0 x70 表示共享模式 映射到变量dwShareMode 取值为枚举类型的FILE SHARE READ FILE SHARE WRITE FILE SHARE WRITE FILE SHARE READ 3 Open函数定义了一个SECURITY ATTRIBUTES类型的局部变量sa nOpenFlags 0 x80 被赋值给sa bInheritHandle 4 nOpenFlags modeCreate 表示创建方式 映射到变量dwCreateFlag 取值为枚举类型的OPEN ALWAYS CREATE ALWAYS OPEN EXISTING 10 2 2CFile的成员函数 在生成上述参数后 调用 CreateFile函数打开或者创建文件 HANDLEhFile CreateFile lpszFileName dwAccess dwShareMode CreateFile函数返回的文件句柄hFile被赋值给成员变量m hFile 同时将m bCloseOnDelete设置为TRUE 从上面讨论可以看出 利用CFile打开或创建文件大大简化了 CreateFile函数的复杂性 只需要指定文件名和文件打开方式即可 若文件打开方式参数指定为0 表示以只读方式打开存在的文件 并且是独占使用 不允许子进程继承 使用CFile对象时 如果它是在堆上分配的 则应该显式销毁 如果是在栈上分配的 则CFile对象会自动被销毁 CFile对象销毁时析构函数被调用 如果成员m bCloseOnDelete为真并且m hFile非空 则析构函数会调用Close关闭文件 10 2 3CStdioFile类 CStdioFile类专门负责对文本文件进行操作 它是CFile类的派生类 增加了一个FILE 类型的成员变量m pStream 在打开或者创建文件时 使用WindowsAPI函数 open osfhandle将m hFile转换成 C FILE类型的文件指针 随后 在文件操作中 使用 C 文件操作函数 例如 读文件使用 fread 而不是 ReadFile 写文件使用了 fwrite 而不是 WriteFile等 CStdioFile类不支持CFile类的Dumplicate LockRange 和UnlockRange操作 而是实现了两个新的操作ReadString和WriteString 其函数原型成如下 10 2 3CStdioFile类 CStdioFile ReadStringvirtualLPTSTRReadString LPTSTRlpsz UINTnMax BOOLReadString CString 10 3文件对话框 10 3文件对话框 CFileDialog类用于实现文件选择对话框 以支持文件的打开和保存 用户要打开或者保存文件时 就会和文件选择对话框打交道 用VS2010的 应用程序向导 建立的应用程序框架中自动加入了文件选择对话框 选择 文件 菜单下的 打开 或者 另存为 菜单项就会打开文件选择对话框 如图10 1所示 10 3文件对话框 图10 1文件选择对话框 10 3文件对话框 文件选择对话框的创建与普通对话框的创建类似 首先是构建一个CFileDialog类的对象 然后调用CFileDialog DoModal 函数来打开对话框 文件对话框的构造函数原型如下 CFileDialog BOOLbOpenFileDialog LPCTSTRlpszDefExt NULL LPCTSTRlpszFileName NULL DWORDdwFlags OFN HIDEREADONLY OFN OVERWRITEPROMPT LPCTSTRlpszFilter NULL CWnd pParentWnd NULL 10 3文件对话框 如果参数bOpenFileDialog为TRUE 表示要创建Open 打开文件 对话框 否则要创建SaveAs 保存文件 对话框 参数lpszDefExt指定缺省文件扩展名 lpszFileName用于指定初始文件名 dwFlags用于设置对话框的一些特性 lpszFilter指向一个过滤字符串 用户如果只想选择某种或某几种类型的文件 就需要指定过滤字符串 参数pParentWnd是指向父窗口或者拥有者窗口的指针 10 3文件对话框 如果参数bOpenFileDialog为TRUE 表示要创建Open 打开文件 对话框 否则要创建SaveAs 保存文件 对话框 参数lpszDefExt指定缺省文件扩展名 lpszFileName用于指定初始文件名 dwFlags用于设置对话框的一些特性 lpszFilter指向一个过滤字符串 用户如果只想选择某种或某几种类型的文件 就需要指定过滤字符串 参数pParentWnd是指向父窗口或者拥有者窗口的指针 第10章MFC中的文件操作 10 3文件对话框 过滤字符串具有特定的格式 它实际上是由多个子串组成 每个子串包含两部分 第一部分是过滤器的文字说明 如 Textfile txt 第二部分是用于过滤的匹配字符串 如 txt 子串两部分之间用竖线字符 分隔 各个子串之间也是用 分隔 而且整个串的最后两个字符必须是两个连续的竖线字符 下面给出一个典型的过滤字符串实例 charszFilter Allfiles Textfiles txt txt Worddocuments doc doc 如果CFileDialog DoModal返回的是IDOK 那么就可以用表10 2所列的CFileDialog类的成员函数来获取与所选文件有关的信息 第10章MFC中的文件操作 10 3文件对话框 表10 2CFileDialog类的常用成员函数 10 4文件操作举例 10 4 1创建项目 1 在VS2010开发环境中 点击菜单 文件 新建 项目 打开 新建项目 对话框 选择项目模板为 MFC应用程序 在 名称 框中输入 S10 1 在 位置 框中输入项目的保存路径 单击 确定 按钮 弹出 MFC应用程序向导 对话框 2 在 MFC应用程序向导 对话框中 选择应用程序类型为 基于对话框 如图10 2所示 单击 完成 按钮 完成项目创建 10 4 1创建项目 图10 2S10 1应用程序类型对话框 10 4 2设计应用程序界面 在应用程序默认界面 对话框 上添加1个GroupBox 4个Button 2个EditBox 2个StaticText 界面设计如图10 3所示 图10 3S10 1主界面 10 4 2设计应用程序界面 在对话框上添加的各控件参数如表10 3所示 表10 3S10 1对话框上各控件及其属性设置 10 4 2设计应用程序界面 按Ctrl Shift X 打开 类向导 对话框 选择对话框类CS10 1Dlg 分别为两个编辑框IDC COPY PATH和IDC PASTE PATH添加字符串变量m sCopyPath和m sPastePath 在类CS10 1Dlg中添加以下两个成员变量 public char pStr longm iCount 10 4 3添加程序复制功能 打开 类向导 对话框 分别为按钮IDC COPY S和IDC COPY添加BN CLICKED消息响应函数 定位到相应的消息响应函数 并添加以下程序代码 voidCS10 1Dlg OnCopyS TODO AddyourcontrolnotificationhandlercodehereCFileDialogmFileDlg TRUE NULL NULL OFN HIDEREADONLY OFN OVERWRITEPROMPT OFN ALLOWMULTISELECT AllFiles AfxGetMainWnd if mFileDlg DoModal IDCANCEL 10 4 3添加程序复制功能 m sCopyPath mFileDlg GetPathName if m sCopyPath GetDlgItem IDC COPY EnableWindow true elseGetDlgItem IDC COPY EnableWindow false UpdateData false voidCS10 1Dlg OnCopy TODO AddyourcontrolnotificationhandlercodehereCFilemFile mFile Open m sCopyPath CFile modeRead NULL 10 4 3添加程序复制功能 m iCount mFile GetLength pStr newchar m iCount if pStr NULL CStringstr str 内存不足 打开 m sCopyPath 文件失败 MessageBox str 提示 MB OK mFile Read pStr m iCount mFile Close 10 4 4为程序添加粘贴功能 打开 类向导 对话框 分别为按钮IDC PASTE S和IDC PASTE添加BN CLICKED消息响应函数 定位到相应的函数后 添加如下程序代码 voidCS10 1Dlg OnPasteS TODO AddyourcontrolnotificationhandlercodehereCFileDialogmFileDlg false NULL NULL OFN HIDEREADONLY OFN OV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 崇左市2025年医师资格考试(实践技能)复习题库及答案
- 印后制作员工艺创新考核试卷及答案
- 2025水利二建考试题真题及答案新增,速看
- 2025年黑龙江省哈尔滨市中级会计职称经济法预测试题含答案
- 2025年南充三诊试卷及各科参考答案详解
- 2025消防设施操作员中级理论考试400题(附答案)
- 2025年《医学影像检查技术》考试复习题库(含答案)
- (2025)中小学教师高级职称专业水平能力题库(含答案)
- 2025年初级社会工作者工作实务真题和答案
- 农发行伊犁哈萨克自治州霍城县2025秋招笔试价值观测评题专练及答案
- 供水工程成本预算与动态控制方案
- (2025年标准)清理乱账服务协议书
- GB/T 45860.1-2025光纤激光束焊机的验收试验第1部分:光纤输送机的激光组件
- 卒中后抑郁症的中医治疗
- 2025年4月自考00155中级财务会计试题及答案含评分标准
- DB50∕T 1653-2024 林区森林防火及森林质量提升专项规划编制导则
- 道路工程培训课件
- 制冰厂可行性研究报告
- 国庆假期大学生安全教育
- 快递业务流程标准化管理
- 中班健康魔法消气屋课件
评论
0/150
提交评论