第八章 Windows编程.ppt_第1页
第八章 Windows编程.ppt_第2页
第八章 Windows编程.ppt_第3页
第八章 Windows编程.ppt_第4页
第八章 Windows编程.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第八章Windows文件编程,2,主要内容,8.1 文件操作 创建和读写文件、获取文件信息、常用文件操作、MFC的支持(CFile类) 8.2 驱动器和目录 驱动器操作、目录操作 8.3 使用注册表 注册表的结构、管理注册表 8.4 内存映射文件 内存映射文件相关函数、使用内存映射文件读BMP文件,通用对话框及其使用,打开和保存文件对话框,显示目录对话框,示例见07CommDlg程序,通用对话框,打开文件对话框函数: BOOL GetOpenFileName(LPOPENFILENAME lpofn); 保存文件对话框函数: BOOLGetSaveFileName(LPOPENFILENA

2、ME lpofn); lpofn指向OPENFILENAME结构: typedef struct tagOFN DWORD lStructSize; / 结构长度 OPENFILENAME, *LPOPENFILENAME; 注意lpstrFilter的使用: file.lpstrFilter = “Text Files(*.txt)0*.txt0All Files0*.*00”; /默认选第一个 file.nFilterIndex =1,通用对话框,浏览目录对话框函数: BOOL SHBrowseForFolder(LPBROWSEINFO lpbi); lpbi指向包含对话框初始数据的BR

3、OWSEINFO结构 typedef struct _browseinfo HWND hwndOwner, / 对话框的父窗口 UNIT ulFlags, / 标志 BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; 为了使用方便,封装一个CDirDialog类来管理浏览目录对话框(见07CommDlg程序),6,文件的基本操作,MFC的CFile类实现文件输Read、Write等功能; CFile类在底层设备交互时,实现文件输入输出并不方便; 通常采用文件管理的API函数与CFile类同时使用。 主要文件管理的API函数: CreateFile创建文件对象并返回

4、文件句柄 ReadFile和WriteFile操作 CloseHandle函数关闭不再使用的文件对象句柄 CreateFile原型见下页,7,打开和关闭文件,HANDLE CreateFile( LPCTSTR lpFileName, / 要创建或打开的对象名称 DWORD dwDesiredAccess, / 文件的存取方式 DWORD dwShareMode , / 共享属性 LPSECURITY_ATTRIBUTES lpSecurityAttributes, / 安全属性 DWORD dwCreationDiscription, / 文件存在或不存在时系统采取的行动 DWORD dwF

5、lagsAndAttributes, / 设置新创建文件的属性 HANDLE hTempatedFile / 一个文件模板的句柄 );,hTempatedFile 指定一个文件模板句柄,系统会把模板的 所有属性复制到当前创建的文件中。 其它属性设置取值情况见p265,8,HANDLE hFile; hFile = CreateFile(“myfile.txt”, / 要创建的文件 GENERIC_WRITE, / 写文件 0, / 不共享 NULL, / 默认安全属性 CREATE_ALWAYS, / 文件存在就覆盖 FILE_ATTRIBUTE_NORMAL, / 新文件属性 NULL /

6、没有模板 );,创建文件并写入数据,9,随机读取文件,DWORD SetFilePointer( HANDLE hFile, / 文件句柄 LONG lDistanceToMove, / 要移动的距离 PLONG lpDistanceToMoveHigh, / 移动距离的高32位 DWORD dwMoveMothed / 移动的模式 ); dwMoveMethod指明从什么地方开始移动取值为 FILE_BEGIN, FILE_CURRENT, FILE_END,lpDistanceToMoveHigh Long,指定一个长整数变量,其中包含了要使用的一个高双字偏移。可设为零(将声明变为ByVa

7、l),表示只使用lDistanceToMove 原文:A long variable containing a high double word offset to use. May be zero (change declaration to ByVal) to use only lDistanceToMove.,10,读写文件,ReadFileEx和WriteFileEx只能异步读写文件 ReadFile和WriteFile可以同步或异步读写文件,其原型为: BOOL WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite, lpNumberOfByt

8、esWritten, lpOverlapped); BOOL ReadFile(hFile,lpBuffer,nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); 变量说明:,/ 文件句柄 / 指向一个缓冲区,函数会将读出的数据返回到这里 / 要求读入的字节数 / 指向一个 DWORD 类型的变量 / 用于返回实际读入的字节数 / 一般设置为 NULL,11,获取文件信息,获取文件类型 获取文件大小 获取文件属性 DWORD GetFileType(HANDLE hFile); DWORD GetFileSize( HANDLE h

9、File, / 文件句柄 LPDWORD lpFileSizeHigh / 用于返回文件长度的高字。可以 / 指定为NULL ); DWORD GetFileAttributes(LPCTSTR lpFileName);,属性取值见教材pp269,12,文件常用操作,文件复制(Copy) BOOL CopyFile( LPCTSTR lpExistingFileName, / 指定一存在的文件的名称 LPCTSTR lpNewFileName, / 指定新文件的名称 BOOL bFailIfExists / 如果指定的新文件存在是否按出错处理 );,13,文件常用操作,文件删除 BOOL De

10、leteFile(LPCTSTR lpFileName); 文件移动 BOOL MoveFile( LPCTSTR lpExistingFileName, / 存在的文件或目录 LPCTSTR lpNewFileName / 新的文件或目录 );,14,MFC的支持(CFile类),打开文件:调用CFile:Open函数 CFile file; CFileException e; if(file.Open(_T(“File.txt”), CFile:modeReadWrite, ,15,读写文件,读写前先确定大小(使用CFile的构造函数) BYTE buffer4096; / 每次读4KB大

11、小数据 CFile file(_T(“File.txt”), CFile:modeRead); DWORD dwByteRemaining = file.GetLength(); while(dwBytesRemaining) UINT nBytesRead = file.Read(buffer, sizeof(buffer); dwBytesRemaining -= nBytesRead; ,16,驱动器的操作,设置驱动器卷标: BOOL SetVolumeLabel( LPCTSTR lpRootPathName,/ 目标逻辑驱动器根目录名称, / 如要设置C盘卷标,应指定为“C:” LP

12、CTSTR lpVolumeName / 要设置的卷标名称,如果为NULL则删除卷标 ); 如果lpRootPathName设为NULL,则设置当前目录所在驱动器卷标 使用举例: SetVolumeLabel(c:, NewLabel);,17,获取驱动器卷标,逻辑驱动器序列号在格式化驱动器时,由操作系统随机分配的 一个GUID( Globally Unique Identifier),用于标识卷,BOOL GetVolumeInfomation( LPCTSTR lpRootPathName, / 目标逻辑驱动器根目录名称,如要检测C盘卷标,应指定为“C:” LPCTSTR lpVolume

13、NameBuffer, / 用来取得驱动器卷标的缓冲区, / 长度由下面的nVolumeNameSize参数指定 DWORD nVolumeNameBuffer, LPDWORD lpVolumeSerialNumber, / 用来取得驱动器序列号的双字变量地址 LPDWORD lpMaximumComponentLength, / 函数在这里返回文件系统 / 所支持的文件名的最大长度 LPDWORD lpFileSystemFlags, / 在这里返回指定驱动器的属性信息 LPDWORD lpFileSystemNameBuffer, / 在这里返回文件系统名称,如“FAT”或“NTFS”,

14、 / 长度由下面的 nFileSystemNameSize 参数指定 DWORD nFileSystemNameSize );,18,驱动器的操作,检测逻辑驱动器: DWORD GetLogicalDriver(void); 返回值是一个掩码,描述当前可用驱动器,第0位(最低位)代表A驱动器,第一位代表驱动器B,第二位代表驱动器C,如某一位值是1则说明对应驱动器可用 格式化驱动器: DWORD SHFormatDrive( HWND hwnd, / 为格式化对话框指定父窗口句柄 UINT drive, / 要格式化的驱动器。0代表A盘,1代表B盘,依次类推 UINT fmtID,/ 物理格式标

15、记,仅有一个取值:SHFMT_ID_DEFAULT UINT option / 用于改变对话框的默认选项,0表示默认,SHFMT_OPT_FULL表示选中“快速格式 ) / 化”选项,SHFMT_OPT_SYSONLY表示选中“创建一个MS-DOS启动盘”选项,/ 为 0 时一个都不选,19,格式化驱动器,函数的返回值是最后一次成功格式化的磁盘标识, 或者是下列取值之一: SHFMT_ERROER 上次格式化出错,磁盘可能被格式化 SHFMT_CANCEL 格式化被取消弹出格式化对话框 SHFMT_NOFORMAT 不能进行格式化 SHFormatDrive(hMain Wnd,2,SHFMT

16、_ID_DEFAULT,0 )可以 弹出格式化对话框。,C盘格式化对话框:,20,目录操作,创建单层目录: BOOL CreateDirectory( LPCTSTR lpPathName, / 指定要创建的目录 LPSECURITY_ATTRIBUTES / 指定目录的安全属性 ); 创建多层目录: BOOL MakeSureDirectoryPathExists(LPCTSTR lpszDirPath) CString strDirPath = lpszDirPath; int nPos; / lpszDirPath 为要创建的目录, 如“C:Dir1Dir2” while(nPos =

17、strDirPath.Find(, nPos+1) != -1 :CreateDirectory(strDirPath.Left(nPos, NULL), return :CreateDirectory(strDirPath, NULL); ,21,存在的空目录可以被删除: BOOL RemoveDirectory(LPCTSTR lpPathName);,目录操作,22,注册表是一数据库,结构类似于逻辑磁盘 注册表包含键(Key-目录)和键值(Value-文件) 一个键可以包含多个子键(与建不加区分)和键值 顶层键称为根键,注册表有6个根键,分别储存不同信 息如下: HEKY_CLASSES

18、_ROOT: 基层类别键,定义了系统中所有以经注册的文件扩展名. 文件类型,文件图表. HEKY_CURRENT_USER: 定义了当前用户的所有权限, 实际上是HEKY-USERS.DEFAULT下面的一部分内容,包括了当前用户的登陆信息. HKEY_LOCAL_MACHINE: 定义了本地计算机(相对网络环镜而言)的软硬件全部信息.当系统配置和设置发生变化时,其下面的登陆项也会随之改变.,注册表的使用,注册表的使用,HEKY_USERS: 定义了所有用户信息,其中部分分支将映射到HEKY_CURRENT_USER关键字中,它的大部分设置都可以通过控制面板来修改. HEKY_CURRENT_

19、CONFIG: 定义了计算机得当前配置,如显示器,打印机的信息,它实际上也是指向HEKY_LOCAL_MACHINECONFIG结构中某个分之的指针. HEKY_DYN_DATA: 定义了系统运行中的动态数据,即以发生的事件的有关信息(Win 98/me 以前版本) HKEY_PERFORMANCE_DATA: 在Windows NT/2000/XP注册表中虽然没有HKEY_DYN_DATA键,但是它却隐藏了一个名为“HKEY_ PERFOR MANCE_DATA”键。所有系统中的动态信息都是存放在此子键中。系统自带的注册表编辑器无法看到此键,但可以用专门的程序来查看此键,比如使用性能监视器。

20、,24,注册表的使用,键值存储不同的数据类,最常用的有三类:,REG_DWORD 双字型变量,可以存储数字或布 尔形变量 REG_BINARY 二进制变量,可以存储长度超过 32位的数字和原始数据,如加密密码 REG_SZ 字符串变量,按快捷键+R打开运行对话框,在打开窗口输入regedit并单击确定,可打开Windows注册表编辑器:,25,可使用一系列函数来管理注册表: 打开关闭子键 创建和删除子键 键值操作等,26,内存映射文件保留了一个地址空间区域类似于虚拟内存 在需要时将它提交到物理存储器 提交的数据来自磁盘相应文件而不是系统页文件 一旦文件被映射就认为文件被加载到内存可以被访问 使用内存文件映射有三个目的:,内存映射文件,系统使用它来加载和执行.exe和DLL 访问磁盘上的文件 使用内存映射文件在多个进程间共享数据,27,内存映射文件函数,CreateFileMapping OpenFileMapping MapViewOfFile UnmapViewFile FlushViewFIle,28,内存映射文件方法,使用CreateFileMapping创建一个内存映射文件对象: HANDLE CreateFileMapping( HANDLE hFile, / 一个文件句柄 LPSECURITY_ATTRIBUTE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论