?? mfc教程_ mfc下的文件類.htm
字號:
<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&) </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&) </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 &
3)表示了讀寫標識,映射成變量dwAccess,可以取值為Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。</P>
<P align=justify>(nOpenFlags &
0x70)表示了共享模式,映射成變量dwShareMode,可以取值為Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。</P>
<P align=justify>Open定義了一個局部的SECURITY_ATTRIBUTES變量sa,(nOpenFlags &
0x80)被賦值給sa.bInheritHandle。</P>
<P align=justify>(nOpenFlags &
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, &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& 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->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> </P>
<P align=justify></P></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -