📄 mfc教程_ mfc下的文件类.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0042)http://www.vczx.com/tutorial/mfc/mfc11.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC下的文件类</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3354" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=11>
<P align=justify>
<LI><A name=_Toc452640991></A><A name=_Toc457299100></A><B>MFC下的文件类</B>
<P></P>
<OL>
<P align=justify>
<LI><B><A name=_Toc452640992></A><A name=_Toc457299101></A>文件操作的方法</B>
<P></P>
<P align=justify>使用Visual C++编程,有如下方法进行文件操作:</P>
<P align=justify>(1)使用标准C运行库函数,包括fopen、fclose、fseek等。</P>
<P
align=justify>(2)使用Win16下的文件和目录操作函数,如lopen、lclose、lseek等。不过,在Win32下,这些函数主要是为了和Win16向后兼容。</P>
<P
align=justify>(3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。</P>
<P
align=justify>Win32下,打开和创建文件都由CreateFile完成,成功的话,得到一个Win32下的句柄,这不同于“C”的fopen返回的句柄。在Win16下,该句柄和C运行库文件操作函数相容。但在Win32下,“C”的文件操作函数不能使用该句柄,如果需要的话,可以使用函数_open_osfhandle从Win32句柄得到一个“C”文件函数可以使用的文件句柄。</P>
<P align=justify>关闭文件使用Win32的CloseHandle。</P>
<P
align=justify>在Win32下,CreateFile可以操作的对象除了磁盘文件外,还包括设备文件如通讯端口、管道、控制台输入、邮件槽等等。</P>
<P
align=justify>(4)使用CFile和其派生类进行文件操作。CFile从CObject派生,其派生类包括操作文本文件的CStdioFile,操作内存文件的CmemFile,等等。</P>
<P align=justify>CFile是建立在Win32的文件操作体系的基础上,它封装了部分Win32文件操作函数。</P>
<P align=justify></P>
<P
align=justify>最好是使用CFile类(或派生类)的对象来操作文件,必要的话,可以从这些类派生自己的文件操作类。统一使用CFile的界面可以得到好的移植性。</P>
<P align=justify></P>
<LI><A name=_Toc452640993></A><A name=_Toc457299102></A><B>MFC的文件类</B>
<P></P>
<P align=justify>MFC用一些类来封装文件访问的Win32
API。以CFile为基础,从CFile派生出几个类,如CStdioFile,CMemFile,MFC内部使用的CMiororFile,等等。</P>
<OL>
<P align=justify>
<LI><A name=_Toc452640994></A><A name=_Toc457299103></A><B>CFile的结构</B>
<P></P>
<OL>
<P align=justify>
<LI><B><A name=_Toc457299104></A>CFile定义的枚举类型</B>
<P></P></LI></OL></LI></OL></LI></OL></LI></OL>
<P
align=justify>CFile类定义了一些和文件操作相关的枚举类型,主要有四种:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分别解释这些枚举类型。</P>
<OL>
<P align=justify>
<LI>OpenFlags
<P></P>
<P align=justify>OpenFlags定义了13种文件访问和共享模式:</P>
<P align=justify>enum OpenFlags {</P>
<P align=justify>//第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写</P>
<P align=justify>modeRead = 0x0000,</P>
<P align=justify>modeWrite = 0x0001,</P>
<P align=justify>modeReadWrite = 0x0002,</P>
<P align=justify>shareCompat = 0x0000, //32位MFC中没用</P>
<P align=justify>//第五到第七位,打开文件时的共享模式</P>
<P align=justify>shareExclusive = 0x0010,//独占方式,禁止其他进程读写</P>
<P align=justify>shareDenyWrite = 0x0020,//禁止其他进程写</P>
<P align=justify>shareDenyRead = 0x0030,//禁止其他进程读</P>
<P align=justify>shareDenyNone = 0x0040,//允许其他进程写</P>
<P align=justify>//第八位,打开文件时的文件继承方式</P>
<P align=justify>modeNoInherit = 0x0080,//不允许子进程继承</P>
<P align=justify>//第十三、十四位,是否创建新文件和创建方式</P>
<P align=justify>modeCreate = 0x1000,//创建新文件,文件长度0</P>
<P align=justify>modeNoTruncate = 0x2000,//创建新文件时如文件已存在则打开</P>
<P align=justify>//第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用</P>
<P align=justify>typeText = 0x4000,</P>
<P align=justify>typeBinary = (int)0x8000</P>
<P align=justify>};</P>
<P align=justify></P>
<LI>Attribute
<P></P>
<P align=justify>Attribute定义了文件属性:正常、只读、隐含、系统文件,文件或者目录等。</P>
<P align=justify>enum Attribute {</P>
<P align=justify>normal = 0x00,</P>
<P align=justify>readOnly = 0x01,</P>
<P align=justify>hidden = 0x02,</P>
<P align=justify>system = 0x04,</P>
<P align=justify>volume = 0x08,</P>
<P align=justify>directory = 0x10,</P>
<P align=justify>archive = 0x20</P>
<P align=justify>}</P>
<P align=justify></P>
<LI>SeekPosition
<P></P>
<P align=justify>SeekPosition定义了三种文件位置:头、尾、当前:</P>
<P align=justify>enum SeekPosition{</P>
<P align=justify>begin = 0x0,</P>
<P align=justify>current = 0x1,</P>
<P align=justify>end = 0x2</P>
<P align=justify>};</P>
<P align=justify></P>
<LI>hFileNull
<P></P></LI></OL>
<P align=justify>hFileNull定义了空文件句柄</P>
<P align=justify>enum { hFileNull = -1 };</P>
<OL>
<OL>
<OL>
<OL>
<P align=justify>
<LI><A name=_Toc457299105></A><B>CFile的其他一些成员变量</B>
<P></P>
<P align=justify>CFile除了定义枚举类型,还定义了一些成员变量。例如:</P>
<P align=justify>UINT m_hFile</P>
<P
align=justify>该成员变量是public访问属性,保存::CreateFile返回的操作系统的文件句柄。MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。</P>
<P align=justify></P>
<P align=justify>BOOL m_bCloseOnDelete;</P>
<P align=justify>CString m_strFileName;</P>
<P
align=justify>这两个成员变量是protected访问属性。m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。</P>
<P align=justify></P>
<LI><A name=_Toc457299106></A><B>CFile的成员函数</B>
<P></P></LI></OL></OL></OL></OL>
<P
align=justify>CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。一般地,成员函数被映射到对应的Win32函数,如表11-1所示。</P>
<P align=center>表11-1 CFile函数对Win32文件函数的封装</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="6%">
<P align=justify>虚拟 </P></TD>
<TD vAlign=top width="5%">
<P align=justify>静态 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>成员函数 </P></TD>
<TD vAlign=top width="50%">
<P align=justify>对应的Win32函数 </P></TD></TR>
<TR>
<TD vAlign=top colSpan=4>
<P align=justify>文件的创建、打开、关闭 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Abort </P></TD>
<TD vAlign=top width="50%">
<P align=justify>CloseHandle </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Duplicate </P></TD>
<TD vAlign=top width="50%">
<P align=justify>DuplicateHandle </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Open </P></TD>
<TD vAlign=top width="50%">
<P align=justify>CreateFile </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Close </P></TD>
<TD vAlign=top width="50%">
<P align=justify>CloseHandle </P></TD></TR>
<TR>
<TD vAlign=top colSpan=4>
<P align=justify>文件的读写 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Read </P></TD>
<TD vAlign=top width="50%">
<P align=justify>ReadFile </P></TD></TR>
<TR>
<TD vAlign=top width="6%"> </TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>ReadHuge(向后兼容) </P></TD>
<TD vAlign=top width="50%">
<P align=justify>调用Read成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Write </P></TD>
<TD vAlign=top width="50%">
<P align=justify>WriteFile </P></TD></TR>
<TR>
<TD vAlign=top width="6%"> </TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>WriteHuage(向后兼容) </P></TD>
<TD vAlign=top width="50%">
<P align=justify>调用Write成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Flush </P></TD>
<TD vAlign=top width="50%">
<P align=justify>FlushFileBuffers </P></TD></TR>
<TR>
<TD vAlign=top colSpan=4>
<P align=justify>文件定位 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>Seek </P></TD>
<TD vAlign=top width="50%">
<P align=justify>SetFilePointer </P></TD></TR>
<TR>
<TD vAlign=top width="6%"> </TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>SeekToBegin </P></TD>
<TD vAlign=top width="50%">
<P align=justify>调用Seek成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="6%"> </TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>SeekToEnd </P></TD>
<TD vAlign=top width="50%">
<P align=justify>调用Seek成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="6%">
<P align=justify>√ </P></TD>
<TD vAlign=top width="5%"> </TD>
<TD vAlign=top width="39%">
<P align=justify>GetLength </P></TD>
<TD vAlign=top width="50%">
<P align=justify>调用Seek成员函数 </P></TD></TR>
<TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -