ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:28.14KB ,
资源ID:5334810      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5334810.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC下的文件类CFile.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC下的文件类CFile.docx

1、MFC下的文件类CFileMFC下的文件类11. MFC下的文件类 1. 文件操作的方法 使用Visual C+编程,有如下方法进行文件操作:(1)使用标准C运行库函数,包括fopen、fclose、fseek等。(2)使用Win16下的文件和目录操作函数,如lopen、lclose、lseek等。不过,在Win32下,这些函数主要是为了和Win16向后兼容。(3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。Win32下,打开和创建文件都由CreateFile完成,成功的话,得到一个Win32下的句柄,这

2、不同于“C”的fopen返回的句柄。在Win16下,该句柄和C运行库文件操作函数相容。但在Win32下,“C”的文件操作函数不能使用该句柄,如果需要的话,可以使用函数_open_osfhandle从Win32句柄得到一个“C”文件函数可以使用的文件句柄。关闭文件使用Win32的CloseHandle。在Win32下,CreateFile可以操作的对象除了磁盘文件外,还包括设备文件如通讯端口、管道、控制台输入、邮件槽等等。(4)使用CFile和其派生类进行文件操作。CFile从CObject派生,其派生类包括操作文本文件的CStdioFile,操作内存文件的CmemFile,等等。CFile是建

3、立在Win32的文件操作体系的基础上,它封装了部分Win32文件操作函数。最好是使用CFile类(或派生类)的对象来操作文件,必要的话,可以从这些类派生自己的文件操作类。统一使用CFile的界面可以得到好的移植性。2. MFC的文件类 MFC用一些类来封装文件访问的Win32 API。以CFile为基础,从CFile派生出几个类,如CStdioFile,CMemFile,MFC内部使用的CMiororFile,等等。1. CFile的结构 1. CFile定义的枚举类型 CFile类定义了一些和文件操作相关的枚举类型,主要有四种:OpenFlags,Attribute,SeekPosition

4、,hFileNull。下面,分别解释这些枚举类型。1. OpenFlags OpenFlags定义了13种文件访问和共享模式:enum OpenFlags /第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写modeRead = 0x0000,modeWrite = 0x0001,modeReadWrite = 0x0002,shareCompat = 0x0000, /32位MFC中没用/第五到第七位,打开文件时的共享模式shareExclusive = 0x0010,/独占方式,禁止其他进程读写shareDenyWrite = 0x0020,/禁止其他进程写shareDenyRe

5、ad = 0x0030,/禁止其他进程读shareDenyNone = 0x0040,/允许其他进程写/第八位,打开文件时的文件继承方式modeNoInherit = 0x0080,/不允许子进程继承/第十三、十四位,是否创建新文件和创建方式modeCreate = 0x1000,/创建新文件,文件长度0modeNoTruncate = 0x2000,/创建新文件时如文件已存在则打开/第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用typeText = 0x4000,typeBinary = (int)0x8000;2. Attribute Attribute定义

6、了文件属性:正常、只读、隐含、系统文件,文件或者目录等。enum Attribute normal = 0x00,readOnly = 0x01,hidden = 0x02,system = 0x04,volume = 0x08,directory = 0x10,archive = 0x203. SeekPosition SeekPosition定义了三种文件位置:头、尾、当前:enum SeekPositionbegin = 0x0,current = 0x1,end = 0x2;4. hFileNull hFileNull定义了空文件句柄enum hFileNull = -1 ;1. CF

7、ile的其他一些成员变量 CFile除了定义枚举类型,还定义了一些成员变量。例如:UINT m_hFile该成员变量是public访问属性,保存:CreateFile返回的操作系统的文件句柄。MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。BOOL m_bCloseOnDelete;CString m_strFileName;这两个成员变量是protected访问属性。m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。2. CFile的成员函数 CFile的成员函数

8、实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。一般地,成员函数被映射到对应的Win32函数,如表11-1所示。表11-1 CFile函数对Win32文件函数的封装虚拟 静态 成员函数 对应的Win32函数 文件的创建、打开、关闭 Abort CloseHandle Duplicate DuplicateHandle Open CreateFile Close CloseHandle 文件的读写 Read ReadFile Re

9、adHuge(向后兼容) 调用Read成员函数 Write WriteFile WriteHuage(向后兼容) 调用Write成员函数 Flush FlushFileBuffers 文件定位 Seek SetFilePointer SeekToBegin 调用Seek成员函数 SeekToEnd 调用Seek成员函数 GetLength 调用Seek成员函数 SetLength SetEndOfFile 文件的锁定/解锁 LockRange LockFile UnlockRange UnlockFile 文件状态操作函数 GetPosition SetFilePointer GetStatu

10、s(CFileStatus&) GetFileTime,GetFileSize等 GetStatus(LPSTR lpszFileName CFileStatus&) FindFirstFile GetFileName 不是简单地映射到某个函数 GetFileTitle GetFilePath SetFilePath SetStatus 改名和删除 Rename MoveFile Remove DeleteFile 1. CFile的部分实现 这里主要讨论CFile对象的构造函数和文件的打开/创建的过程。1. 构造函数 CFile有如下几个构造函数: CFile() 缺省构造函数,仅仅构造一个

11、CFile对象,还必须使用Open成员函数来打开文件。 CFile(int hFile) 已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。HFile将被赋值给CFile的成员变量m_hFile。 CFile(LPCTSTR lpszFileName, UINT nOpenFlags) 指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件,把文件句柄保存到m_hFile。1. 打开/创建文件 Open的原型如下:BOOL CFile:Open(LPCTSTR lpszFileName, UINT nOpenFlags,CFileException

12、* pException)Open调用Win32函数:CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。CreateFile函数的原型如下:HANDLE CreateFile(LPCTSTR lpFileName,/ pointer to name of the file DWORD dwDesiredAccess,/ access (read-write) mode DWORD dwShareMode,/ share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, /pointer to security descri

13、ptor DWORD dwCreationDistribution,/ how to create DWORD dwFlagsAndAttributes,/ file attributes HANDLE hTemplateFile/ handle to file with attributes to copy);显然,Open必须把自己的两个参数lpszFileName和nOpenFlags映射到CreateFile的七个参数上。从OpenFlags的定义可以看出,(nOpenFlags & 3)表示了读写标识,映射成变量dwAccess,可以取值为Win32的GENERIC_READ、GEN

14、ERIC_WRITE、GENERIC_READ|GENERIC_WRITE。(nOpenFlags & 0x70)表示了共享模式,映射成变量dwShareMode,可以取值为Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。Open定义了一个局部的SECURITY_ATTRIBUTES变量sa,(nOpenFlags & 0x80)被赋值给sa.bInheritHandle。(nOpenFlags & modeCreate)表示了创建方式,映射成变量dwCreateFlag,可以取值为Win32的OP

15、EN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。在生成了上述参数之后,先调用:CreateFile:HANDLE hFile =:CreateFile(lpszFileName,dwAccess, dwShareMode, &sa,dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);然后,hFile被赋值给成员变量m_hFile,m_bCloseOnDelete被设置为TRUE。由上可以看出,CFile打开(创建)一个文件时大大简化了: CreateFile函数的复杂性,即只需要指定一个文件名、一个打开文件的参数即可。若该参数指定为

16、0,则表示以只读方式打开一个存在的文件,独占使用,不允许子进程继承。在CFile对象使用时,如果它是在堆中分配的,则应该销毁它;如果在栈中分配的,则CFile对象将被自动销毁。销毁时析构函数被调用,析构函数是虚拟函数。若m_bCloseOnDelete为真且m_hFile非空,则析构函数调用Close关闭文件。至于其他CFile成员函数的实现,这里不作分析了。1. CFile的派生类 这里主要简要地介绍CStdioFile和CmemFile及CFileFind。1. CStdioFile CStdioFile对文本文件进行操作。CStdioFile定义了新的成员变量m_pStream,类型是F

17、ILE*。在打开或者创建文件时,使用_open_osfhandle从m_hFile(Win32文件句柄)得到一个“C”的FILE类型的文件指针,然后,在文件操作中,使用“C”的文件操作函数。例如,读文件使用_fread,而不是:ReadFile,写文件使用了_fwrite,而不是:WriteFile,等等。m_hFile是CFile的成员变量。另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是实现了两个新的操作ReadString和WriteString。2. CMemFile CMemFile把一块内存当作一个文件来操作,所

18、以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。3. CFileFind 为了方便文件查找,MFC把有关功能归结成为一个类CFileFind。CFileFind派生于CObject类。首先,它使用FindFile和FineNextFile包装了Win32函数:FindFirstFile和:FindNextFile;其次,它提供了许多函数用来获取文件的状态或者属性。使用CFileStatus结构来描述文件的属性,其定义如下:struct CFileSta

19、tusCTime m_ctime; / 文件创建时间CTime m_mtime; / 文件最近一次修改时间CTime m_atime; / 文件最近一次访问时间LONG m_size; / 文件大小BYTE m_attribute; / 文件属性BYTE _m_padding; / 没有实际含义,用来增加一个字节TCHAR m_szFullName_MAX_PATH; /绝对路径#ifdef _DEBUG/实现Dump虚拟函数,输出文件属性void Dump(CDumpContext& dc) const;#endif;例如:CFileStatus status;pFile-GetStatus

20、(status);#ifdef _DEBUGstatus.dump(afxDump);#endif解读VC+编程中的文件操作API和CFile类解读VC+编程中的文件操作API和CFile类 2006年03月06日09:37 天极yesky 作者:RisingMine在VC编程中,操作文件的方法主要有两种:利用API函数和MFC的CFile类。微软在其中封装了文件的一般操作,下面我就介绍一下如何利用这两种方法实现文件操作。1创建或打开一个文件 API函数CreateFile可打开和创建文件、管道、邮槽、通信服务、设备以及控制台,但是在此时只是介绍用这个函数怎么实现创建和打开一个文件。HANDL

21、E CreateFile(LPCTSTR lpFileName, / 要打开的文件名DWORD dwDesiredAccess, / 文件的操作属性DWORD dwShareMode, / 文件共享属性 LPSECURITY_ATTRIBUTES lpSecurityAttributes,/ 文件安全特性DWORD dwCreationDisposition, /文件操作DWORD dwFlagsAndAttributes, / 文件属性HANDLE hTemplateFile / 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性 );文件的操作属性:如果为零,表示只允许获取与

22、一个设备有关的信息,GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);文件的共享属性:零表示不共享; FILE_SHARE_READ 或 FILE_SHARE_WRITE 表示允许对文件进行读/写共享访问;文件的操作有:CREATE_NEW:创建文件;如文件存在则会出错CREATE_ALWAYS:创建文件,会改写前一个文件OPEN_EXISTING:文件必须已经存在。由设备提出要求OPEN_ALWAYS:如文件不存在则创建它TRUNCATE_EXISTING:将现有文件缩短为零长度文件属性有:FILE_ATTRIBU

23、TE_ARCHIVE:标记归档属性FILE_ATTRIBUTE_COMPRESSED:将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式FILE_ATTRIBUTE_NORMAL:默认属性FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录FILE_ATTRIBUTE_READONLY:文件为只读FILE_ATTRIBUTE_SYSTEM:文件为系统文件FILE_FLAG_WRITE_THROUGH: 操作系统不得推迟对文件的写操作FILE_FLAG_OVERLAPPED:允许对文件进行重叠操作FILE_FLAG_NO_BUFFERING:禁止对文件进行缓冲处理。文件只能写入磁盘卷

24、的扇区块FILE_FLAG_RANDOM_ACCESS:针对随机访问对文件缓冲进行优化FILE_FLAG_SEQUENTIAL_SCAN:针对连续访问对文件缓冲进行优化FILE_FLAG_DELETE_ON_CLOSE:关闭了上一次打开的句柄后,将文件删除。特别适合临时文件可以组合的属性有:FILE_FLAG_WRITE_THROUGH,FILE_FLAG_OVERLAPPED,FILE_FLAG_NO_BUFFERING,FILE_FLAG_RANDOM_ACCESS,FILE_FLAG_SEQUENTIAL_SCAN,FILE_FLAG_DELETE_ON_CLOSE,FILE_FLAG_

25、BACKUP_SEMANTICS,FILE_FLAG_POSIX_SEMANTICS,FILE_FLAG_OPEN_REPARSE_POINT,FILE_FLAG_OPEN_NO_RECALL如果成功返回一个打开文件得句柄,如果调用函数之前文件存在,文件操作属性为:CREATE_ALWAYS 或 OPEN_ALWAYS,使用GetLastError函数返回的是ERROR_ALREADY_EXISTS(包括函数操作成功),如果之前函数不存在,则返回0。使用失败返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函数。文件关闭用:BOOL CloseHand

26、le(HANDLE hObject / handle to object to close);例子1、在当前目录下面创建一个文件:HANDLE handle;DWORD Num;handle= :CreateFile(new.tmp,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_FLAG_DELETE_ON_CLOSE,NULL);if(INVALID_HANDLE_VALUE!= handle ):SetFilePointer(handle,0,0,FILE_BEGIN);char Buffer = 这是个刚创建的文件;:WriteFi

27、le(handle,Buffer,sizeof(Buffer),&Num,NULL);ZeroMemory(Buffer,sizeof(Buffer);:SetFilePointer(handle,0,0,FILE_BEGIN);:ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL);MessageBox(Buffer);:CloseHandle(handle); 可以改变上面的创建文件的属性和操作看下不同效果。CFile创建和打开一个文件:创建文件和打开文件的方法有很多种,下面简单介绍下几个构造函数:CFile( LPCTSTR lpszFileN

28、ame, UINT nOpenFlags );throw( CFileException );CFile( );BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );lpszFileName:文件名称,可以是相对路径,绝对路径或网络路径nOpenFlags:打开方式有:CFile:modeCreate 调用构造函数构造一个新文件,如果文件已存在,则长度变成0。CFile:modeNoTruncate 此值与modeCreate组合使用。如果所创建的文件已存在则其长度不变为0。因而此文件

29、被打开,或者作为一个新文件或者作为一个已存在的文件。这将是很有用的,例如当打开一个可能存在也可能不存在的文件时。CFile:modeRead 打开文件仅供读。CFile:modeReadWrite 打开文件供读写。CFile:modeWrite 打开文件仅供写。CFile:modeNoInherit 阻止文件被子进程继承。CFile:ShareDenyNone 不禁止其它进程读或写访问,打开文件。如果文件已被其它进程以兼容模式打开,则Create失败。CFile:ShareDenyRead 打开文件,禁止其它进程读此文件。如果文件已被其它进程以兼容模式打开,或被其它进程读,则Create失败。CFile:ShareDenyWrite 打开文件,禁止其它进程写此文件。如果文件已被其它进程以兼容模式打开,或被其它进程写,则Create失败。CFile:ShareExclusive 以独占模式打开文件,禁止其它进程对文件的读写。如果文件已经以其它模式打开读写(即使被当前进程),则构造失败。CFile:ShareCompat 此标志在32位MFC中无效。此标志在使用CFile: Open时映射为CFile:ShareExclusive。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1