MFC提供了一個(gè)文件操作的基類CFile,這個(gè)類提供了一個(gè)沒(méi)有緩存的二進(jìn)制格式的磁盤(pán)輸入輸出功能。通過(guò)他的派生類可以間接的支持文本、文件、內(nèi)存文件等。
成都創(chuàng)新互聯(lián)為客戶提供專業(yè)的做網(wǎng)站、網(wǎng)站制作、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、成都做手機(jī)網(wǎng)站等網(wǎng)站方面業(yè)務(wù)。打開(kāi)文件通過(guò)對(duì)CFile類的初始化,即可完成文件的打開(kāi)
CFile類的其中一個(gè)構(gòu)造函數(shù):
CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
? 表示文件名
? 表示打開(kāi)方式
CFile打開(kāi)文件模式總結(jié),里面有幾種模式可能是SDK中的高級(jí)模式,使用頻率不高,不過(guò)應(yīng)該可以在某種場(chǎng)合滿足用戶的一些高級(jí)要求。因?yàn)槲覜](méi)有用到過(guò),所以可能翻譯的理解上有偏差。如果以后有幸能理解透徹,再來(lái)斟酌修改吧。
打開(kāi)模式 | 含義 |
CFile::modeCreate | 直接構(gòu)建創(chuàng)建一個(gè)新文件。如果該文件已經(jīng)存在,則文件內(nèi)容自動(dòng)被清零。 |
CFile::modeNoTruncate | 該值一般modeCreate組合使用。如果創(chuàng)建的文件已經(jīng)存在,那么它不會(huì)被清零。因而該文件能可靠的打開(kāi),或者新建一個(gè)文件或者打開(kāi)一個(gè)現(xiàn)存文件。這對(duì)于打開(kāi)一個(gè)可能存在可能不存在的設(shè)置文件十分有用。該選項(xiàng)通用可用于CStdioFile。 |
CFile::modeRead | 以只讀方式打開(kāi)文件 |
CFile::modeReadWrite ? | 以可讀可寫(xiě)方式打開(kāi)文件。 |
CFile::modeWrite | 以只寫(xiě)方式打開(kāi)文件。 |
CFile::modeNoInherit | 阻止文件被子進(jìn)程繼承。 |
CFile::shareDenyNone | 以不拒絕其他進(jìn)程對(duì)文件的讀寫(xiě)方式打開(kāi)。如果文件已經(jīng)被其他進(jìn)程以compatibility模式打開(kāi),則文件創(chuàng)建失敗。 |
CFile::shareDenyRead | 以拒絕其他進(jìn)程對(duì)文件讀的方式打開(kāi)。如果文件已經(jīng)被其他進(jìn)程以compatibility模式或讀打開(kāi),則文件創(chuàng)建失敗。 |
CFile::shareDenyWrite | 以拒絕其他進(jìn)程對(duì)文件寫(xiě)的方式打開(kāi)。如果文件已經(jīng)被其他進(jìn)程以compatibility模式或?qū)懘蜷_(kāi),則文件創(chuàng)建失敗。 |
CFile::shareExclusive | 以exclusive方式打開(kāi),拒絕其他進(jìn)程對(duì)文件的讀寫(xiě)。如果該文件已經(jīng)被不管任何進(jìn)程以任何方式打開(kāi)都構(gòu)建失敗。 |
CFile::shareCompat | 此標(biāo)志在32位MFC中無(wú)效。該標(biāo)志當(dāng)使用CFile::Open時(shí)映射為CFile::shareExclusive。 |
CFile::typeText | 以文本方式打開(kāi)。 |
CFile::typeBinary ?? | 以二進(jìn)制方式打開(kāi)(只在派生類中使用)。 |
CFile::osNoBuffer | 系統(tǒng)打開(kāi)文件不開(kāi)系統(tǒng)緩存??刹榭碢latform SDK中CreateFile的FILE_FLAG_NO_BUFFERING。 |
CFile::osWriteThrough | 通過(guò)任何快速緩存并直接寫(xiě)磁盤(pán)的標(biāo)志。可查看Platform SDK中CreateFile的FILE_FLAG_WRITE_THROUGH。 |
CFile::osRandomAccess | 隨機(jī)訪問(wèn)文件方式。系統(tǒng)使用這種方式優(yōu)化文件緩沖區(qū)。 |
CFile::osSequentialScan | 從開(kāi)頭到結(jié)尾的順序訪問(wèn)文件方式。系統(tǒng)使用這種方式來(lái)優(yōu)化文件緩沖區(qū)??刹榭碢latform SDK中CreateFile的FILE_FLAG_SEQUENTIAL_SCAN。 |
寫(xiě)文件時(shí),需調(diào)用類的Write函數(shù)
void CFile::Write(const void* lpBuf, UINT nCount);
表示寫(xiě)入數(shù)據(jù)的緩沖區(qū)
表示寫(xiě)入數(shù)據(jù)的字符數(shù)
讀文件?讀文件時(shí),調(diào)用類的Read函數(shù)?
UINT CFile::Read(void* lpBuf, UINT nCount);
表示接收讀取數(shù)據(jù)的緩沖區(qū)
表示要讀取數(shù)據(jù)的字符數(shù)
返回讀取到緩沖區(qū)的字節(jié)數(shù)?
在文件操作完畢后需要調(diào)用Close函數(shù)來(lái)關(guān)閉文件,如果在銷(xiāo)毀對(duì)象之前尚未關(guān)閉文件,析構(gòu)函數(shù)將為您關(guān)閉該文件。如果使用new
在堆上分配對(duì)象,則必須在關(guān)閉 file.setsto 后將其刪除。
我們可以使用CFile類的GetLength函數(shù)來(lái)獲取文件的長(zhǎng)度
virtual ULONGLONG CFile::GetLength() const;
該函數(shù)可以返回我們打開(kāi)的文件長(zhǎng)度?
Example?代碼示例:
寫(xiě)文件時(shí),使用CFile::modeCreate和CFile::modeWrite模式初始我們的CFile類
//mfc文件操作
void CMyFileCFileView::OnMFCWriteFile() {
//MFC提供的文件操作時(shí)CFile類
CFile file(L"4.txt", CFile::modeCreate | CFile::modeWrite); //CFile提供的其中一個(gè)構(gòu)造函數(shù)
file.Write("Hello World", strlen("Hello World"));
file.Close();
}
讀文件,首先獲得文件的大小,根據(jù)大小new一個(gè)字符緩沖區(qū)接收讀取的文件內(nèi)容。?
//讀文件
void CMyFileCFileView::OnMFCReadFile() {
CFile file(L"4.txt", CFile::modeRead); //CFile提供的其中一個(gè)構(gòu)造函數(shù)
char* pBuf;
//獲取文件大小
DWORD dwFileLen = file.GetLength();
pBuf = new char[dwFileLen + 1];
file.Read(pBuf, dwFileLen);
pBuf[dwFileLen] = 0;
file.Close();
USES_CONVERSION;
CString strBuf = A2W(pBuf);
MessageBox(strBuf);
}
運(yùn)行結(jié)果:?
CFileDialog 類有時(shí)候我們希望能動(dòng)態(tài)更改文件的讀寫(xiě)位置,那么就可以使用CFileDialog類來(lái)實(shí)現(xiàn)這一功能。
CFileDialog類封裝了Windows常用的文件對(duì)話框。常用的文件對(duì)話框提供了一種簡(jiǎn)單的與Windows標(biāo)準(zhǔn)相一致的文件打開(kāi)和文件存盤(pán)對(duì)話框功能。
下面代碼示例了一種簡(jiǎn)單的文件存盤(pán)和打開(kāi)對(duì)話框功能。文件的讀取和寫(xiě)入使用的是MFC的文件讀寫(xiě)。
文件保存:
下面這段程序更改了對(duì)話框標(biāo)題,并限定保存的文件類型為.txt文本類型,當(dāng)用戶點(diǎn)擊對(duì)話框確定按鈕后,程序會(huì)讀取用戶輸入的文件名,并將其保存為.txt類型。最后向文本內(nèi)寫(xiě)入"Tom and Jerry"
void CMyFileCFileView::OnFileDialog() {
CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle = L"提示";//改標(biāo)題
fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
fileDlg.m_ofn.lpstrDefExt = L"txt";
if (IDOK == fileDlg.DoModal()) {
CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
USES_CONVERSION;
char *szBuf = T2A(fileDlg.GetFileName());
file.Write("Tom and Jerry", strlen("Tom and Jerry"));
file.Close();
}
}
文件讀?。?
下面這段程序更改了對(duì)話框標(biāo)題,并限定讀取的文件類型為.txt文本類型,當(dāng)用戶點(diǎn)擊對(duì)話框確定按鈕后,程序會(huì)讀取用戶輸入的文件名,并讀取這個(gè)文件內(nèi)容,之后通過(guò)消息框顯示出來(lái)。
void CMyFileCFileView::OnFileDialogRead() {
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle = L"提示";//改標(biāo)題
fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");
if (IDOK == fileDlg.DoModal()) {
CFile file(fileDlg.GetFileName(), CFile::modeRead);
char* pBuf;
DWORD dwFileLen = file.GetLength();
pBuf = new char[dwFileLen + 1];
pBuf[dwFileLen] = 0;
file.Read(pBuf, dwFileLen);
USES_CONVERSION;
CString strBuf = A2W(pBuf);
MessageBox(strBuf);
file.Close();
}
}
CFileDialog的構(gòu)造函數(shù)
explicit CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE
);
指定要?jiǎng)?chuàng)建的對(duì)話框類型,TRUE表示文件打開(kāi)對(duì)話框,F(xiàn)ALSE表示文件另存為對(duì)話框
表示默認(rèn)文件擴(kuò)展名
表示顯示在“文件名”框中的初始文件名
用于設(shè)置對(duì)話框的標(biāo)志組合,例如標(biāo)題。
指定文件的篩選器。如果指定文件篩選器,則只有與篩選條件匹配的文件才會(huì)顯示在“文件”列表中。
指定文件對(duì)話框的父窗口或所有者的窗口指針
結(jié)構(gòu)的大小。此值取決于操作系統(tǒng)版本。默認(rèn)大小 0 表示 MFC 代碼將根據(jù)運(yùn)行程序的操作系統(tǒng)版本確定要使用的正確對(duì)話框大小。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧