⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfc教程_ mfc下的文件类.htm

📁 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    <TD vAlign=top width="6%">
      <P align=justify>√ </P></TD>
    <TD vAlign=top width="5%"> </TD>
    <TD vAlign=top width="39%">
      <P align=justify>SetLength </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>SetEndOfFile </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>LockRange </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>LockFile </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>UnlockRange </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>UnlockFile </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>GetPosition </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>GetStatus(CFileStatus&amp;) </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>GetFileTime,GetFileSize等 </P></TD></TR>
  <TR>
    <TD vAlign=top width="6%"> </TD>
    <TD vAlign=top width="5%">
      <P align=justify>√ </P></TD>
    <TD vAlign=top width="39%">
      <P align=justify>GetStatus(LPSTR lpszFileName CFileStatus&amp;) </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>FindFirstFile </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>GetFileName </P></TD>
    <TD vAlign=top width="50%">
      <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>GetFileTitle </P></TD>
    <TD vAlign=top width="50%"> </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>GetFilePath </P></TD>
    <TD vAlign=top width="50%"> </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>SetFilePath </P></TD>
    <TD vAlign=top width="50%"> </TD></TR>
  <TR>
    <TD vAlign=top width="6%"> </TD>
    <TD vAlign=top width="5%">
      <P align=justify>√ </P></TD>
    <TD vAlign=top width="39%">
      <P align=justify>SetStatus </P></TD>
    <TD vAlign=top width="50%"> </TD></TR>
  <TR>
    <TD vAlign=top colSpan=4>
      <P align=justify>改名和删除 </P></TD></TR>
  <TR>
    <TD vAlign=top width="6%"> </TD>
    <TD vAlign=top width="5%">
      <P align=justify>√ </P></TD>
    <TD vAlign=top width="39%">
      <P align=justify>Rename </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>MoveFile </P></TD></TR>
  <TR>
    <TD vAlign=top width="6%"> </TD>
    <TD vAlign=top width="5%">
      <P align=justify>√ </P></TD>
    <TD vAlign=top width="39%">
      <P align=justify>Remove </P></TD>
    <TD vAlign=top width="50%">
      <P align=justify>DeleteFile </P></TD></TR></TBODY></TABLE>
<P align=center> </P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452640995></A><A name=_Toc457299107></A><B>CFile的部分实现</B> 
      <P></P></LI></OL></OL></OL>
<P align=justify>这里主要讨论CFile对象的构造函数和文件的打开/创建的过程。</P>
<OL>
  <P align=justify>
  <LI>构造函数 
  <P></P></LI></OL>
<P align=justify>CFile有如下几个构造函数:</P>
<UL>
  <P align=justify>
  <LI>CFile() 
  <P></P></LI></UL>
<P align=justify>缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。</P>
<UL>
  <P align=justify>
  <LI>CFile(int hFile) 
  <P></P></LI></UL>
<P 
align=justify>已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。HFile将被赋值给CFile的成员变量m_hFile。</P>
<UL>
  <P align=justify>
  <LI>CFile(LPCTSTR lpszFileName, UINT nOpenFlags) 
  <P></P></LI></UL>
<P align=justify>指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件,把文件句柄保存到m_hFile。</P>
<OL>
  <P align=justify>
  <LI>打开/创建文件 
  <P></P></LI></OL>
<P align=justify>Open的原型如下:</P>
<P align=justify>BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,</P>
<P align=justify>CFileException* pException)</P>
<P align=justify>Open调用Win32函数::CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。</P>
<P align=justify>CreateFile函数的原型如下:</P>
<P align=justify>HANDLE CreateFile(</P>
<P align=justify>LPCTSTR lpFileName,// pointer to name of the file </P>
<P align=justify>DWORD dwDesiredAccess,// access (read-write) mode </P>
<P align=justify>DWORD dwShareMode,// share mode </P>
<P align=justify>LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to 
security descriptor </P>
<P align=justify>DWORD dwCreationDistribution,// how to create </P>
<P align=justify>DWORD dwFlagsAndAttributes,// file attributes </P>
<P align=justify>HANDLE hTemplateFile// handle to file with attributes to 
copy</P>
<P align=justify>);</P>
<P 
align=justify>显然,Open必须把自己的两个参数lpszFileName和nOpenFlags映射到CreateFile的七个参数上。</P>
<P align=justify>从OpenFlags的定义可以看出,(nOpenFlags &amp; 
3)表示了读写标识,映射成变量dwAccess,可以取值为Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。</P>
<P align=justify>(nOpenFlags &amp; 
0x70)表示了共享模式,映射成变量dwShareMode,可以取值为Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。</P>
<P align=justify>Open定义了一个局部的SECURITY_ATTRIBUTES变量sa,(nOpenFlags &amp; 
0x80)被赋值给sa.bInheritHandle。</P>
<P align=justify>(nOpenFlags &amp; 
modeCreate)表示了创建方式,映射成变量dwCreateFlag,可以取值为Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。</P>
<P align=justify>在生成了上述参数之后,先调用::CreateFile:</P>
<P align=justify>HANDLE hFile =::CreateFile(lpszFileName,</P>
<DIR>
<P align=justify>dwAccess, dwShareMode, &amp;sa,</P>
<P align=justify>dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);</P></DIR>
<P align=justify>然后,hFile被赋值给成员变量m_hFile,m_bCloseOnDelete被设置为TRUE。</P>
<P align=justify></P>
<P align=justify>由上可以看出,CFile打开(创建)一个文件时大大简化了:: 
CreateFile函数的复杂性,即只需要指定一个文件名、一个打开文件的参数即可。若该参数指定为0,则表示以只读方式打开一个存在的文件,独占使用,不允许子进程继承。</P>
<P 
align=justify>在CFile对象使用时,如果它是在堆中分配的,则应该销毁它;如果在栈中分配的,则CFile对象将被自动销毁。销毁时析构函数被调用,析构函数是虚拟函数。若m_bCloseOnDelete为真且m_hFile非空,则析构函数调用Close关闭文件。</P>
<P align=justify>至于其他CFile成员函数的实现,这里不作分析了。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc452640996></A><A name=_Toc457299108></A><B>CFile的派生类</B> 
      <P></P></LI></OL></OL></OL>
<P align=justify>这里主要简要地介绍CStdioFile和CmemFile及CFileFind。</P>
<OL>
  <P align=justify>
  <LI>CStdioFile 
  <P></P>
  <P align=justify>CStdioFile对文本文件进行操作。</P>
  <P 
  align=justify>CStdioFile定义了新的成员变量m_pStream,类型是FILE*。在打开或者创建文件时,使用_open_osfhandle从m_hFile(Win32文件句柄)得到一个“C”的FILE类型的文件指针,然后,在文件操作中,使用“C”的文件操作函数。例如,读文件使用_fread,而不是::ReadFile,写文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成员变量。</P>
  <P 
  align=justify>另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是实现了两个新的操作ReadString和WriteString。</P>
  <P align=justify></P>
  <LI>CMemFile 
  <P></P>
  <P 
  align=justify>CMemFile把一块内存当作一个文件来操作,所以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。</P>
  <P align=justify></P>
  <LI>CFileFind 
  <P></P></LI></OL>
<P 
align=justify>为了方便文件查找,MFC把有关功能归结成为一个类CFileFind。CFileFind派生于CObject类。首先,它使用FindFile和FineNextFile包装了Win32函数::FindFirstFile和::FindNextFile;其次,它提供了许多函数用来获取文件的状态或者属性。</P>
<P align=justify>使用CFileStatus结构来描述文件的属性,其定义如下:</P>
<P align=justify>struct CFileStatus</P>
<P align=justify>{</P>
<P align=justify>CTime m_ctime; // 文件创建时间</P>
<P align=justify>CTime m_mtime; // 文件最近一次修改时间</P>
<P align=justify>CTime m_atime; // 文件最近一次访问时间</P>
<P align=justify>LONG m_size; // 文件大小</P>
<P align=justify>BYTE m_attribute; // 文件属性</P>
<P align=justify>BYTE _m_padding; // 没有实际含义,用来增加一个字节</P>
<P align=justify>TCHAR m_szFullName[_MAX_PATH]; //绝对路径</P>
<P align=justify></P>
<P align=justify>#ifdef _DEBUG</P>
<P align=justify>//实现Dump虚拟函数,输出文件属性</P>
<DIR>
<P align=justify>void Dump(CDumpContext&amp; dc) const;</P></DIR>
<P align=justify>#endif</P>
<P align=justify>};</P>
<P align=justify>例如:</P>
<P align=justify>CFileStatus status;</P>
<P align=justify>pFile-&gt;GetStatus(status);</P>
<P align=justify>#ifdef _DEBUG</P>
<DIR>
<P align=justify>status.dump(afxDump);</P></DIR>
<P align=justify>#endif</P>
<HR>

<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR>
    <TD align=middle><A href="http://www.vczx.com/tutorial/mfc/mfc10.php" 
      target=_self>上一章</A> <A href="http://www.vczx.com/tutorial/mfc/mfc.php" 
      target=_self>回目录</A> <A href="http://www.vczx.com/tutorial/mfc/mfc12.php" 
      target=_self>下一章</A></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P align=justify></P></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -