CFile類提供了對檔案進行開啟,關閉,讀寫,刪除,重新命名以及擷取檔案資訊等檔案操
作的準系統,足以處理任意類型的檔案操作。
CFile類是MFC檔案類的基類,支援無緩衝的二進位輸入輸出,也可以通過與CArchive類
的配合使用而支援對MFC對象的帶緩衝的序列化。
通過CFile類來開啟檔案可以採用兩種方式:一種是先構造一個CFile類對象然後再調用
成員函數Open()開啟檔案,
另一種方法則直接使用CFile類的建構函式去開啟一個檔案。下面語句分別示範了用這兩種
方法開啟磁碟檔案"C:\TestFile.txt"的過程。
1.先構造一個執行個體,然後再開啟檔案
CFile file;
int ret = file.Open("C:\\TestFile.txt", CFile::modeReadWrite);
// 報告檔案開啟是否成功
if (ret == TRUE)
AfxMessageBox("檔案開啟成功!");
else
AfxMessageBox("檔案開啟失敗!");
2.直接通過建構函式開啟檔案
CFile file("C:\\TestFile.txt", CFile::modeReadWrite);
其中參數CFile::modeReadWrite是開啟檔案的模式標誌,CFile類中與之類次的標誌還有十
幾個,先集中列如下表:
表1 檔案模式標誌
─────────────────────────────────────
檔案模式標誌 說明
─────────────────────────────────────
CFile::modeCreate 建立方式開啟檔案,如檔案已存在則將其長度設定為0
─────────────────────────────────────
CFile::modeNoInherit 不允許繼承
─────────────────────────────────────
CFile::modeNoTruncate 建立檔案時如檔案已存在不對其進行截斷
─────────────────────────────────────
CFile::modeRead 唯讀方式開啟檔案
─────────────────────────────────────
CFile::modeReadWrite 讀寫方式開啟檔案
─────────────────────────────────────
CFile::modeWrite 寫入方式開啟檔案
─────────────────────────────────────
CFile::shareCompat 在使用過程中允許其他進程同時開啟檔案
─────────────────────────────────────
CFile::shareDenyNone 在使用過程中允許其他進程對檔案進行讀寫
─────────────────────────────────────
CFile::shareDenyRead 在使用過程中不允許其他進程對檔案進行讀寫
─────────────────────────────────────
CFile::shareDenyWrite 在使用過程中不允許其他進程對檔案進行寫入
─────────────────────────────────────
CFile::shareExclusive 取消對其他進程的所有訪問
─────────────────────────────────────
CFile::typeBinary 設定檔案為二進位模式
─────────────────────────────────────
CFile::typeText 設定檔案為文字模式
─────────────────────────────────────
這些標誌可以通過“或”運算子而同時使用多個,並以此來滿足多種需求。
如:
CFile file("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);
在開啟的檔案不再使用時需要將其關閉,既可以用成員函數Close()關閉也可以通過
CFile類的解構函式來完成。當採取後一種方式時,如果檔案還沒有被關閉,解構函式將
負責隱式調用Close()函數去關閉檔案,這也表明建立在堆上的CFile類對象在超出範圍
後將自動被關閉。由於調用了對象的解構函式,因此在檔案被關閉的同時CFile對象也被
銷毀,而採取Close()方式關閉檔案後,CFile對象仍然存在。所以,在顯式調用Close()
函數關閉一個檔案後可以繼續用同一個CFile對象去開啟其他的檔案。
檔案讀寫是最常用的檔案操作方式,主要由CFile類成員函數Read(),Write()來實現。
其函數原型分別為:
UINT Read(void* lpBuf,UINT nCount);
void Write(const void* lpbuf,UINT nCount);
參數lpBuf為指向存放資料的緩衝的指標,nCount為要讀入或寫入的位元組數,Read()返回
的為實際讀取的位元組數,該數值小於或等於nCount,如果小於nCount則說明已經讀到檔案
末尾,可以結束檔案讀取,如繼續讀取,將返回0。因此通常可以將實際讀取位元組數是否小
於指定讀取的位元組數或是否為0作為判斷檔案讀取是否到達結尾的依據。下面這段代碼示範
了對檔案進行一次性寫入和迴圈多次讀取的處理過程。
// 緩衝
char WriteBuf[1000];
char ReadBuf[100];
//建立、寫入方式開啟檔案
CFile file;
file.Open("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 寫入檔案
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.Write(WriteBuf, sizeof(WriteBuf));
file.Close();
//唯讀方式開啟檔案
file.Open("C:\\TestFile.txt", CFile::modeRead);
while (true)
{
// 讀取檔案資料
int ret = file.Read(ReadBuf, 100);
……
// 如果到達檔案結尾則中止迴圈
if (ret < 100)
break;
}//while
// 關閉檔案
file.Close();
Write()和Read()函數執行完後將自動移動檔案指標,因此不必再顯式調用Seek()函數
去定位檔案指標。包含有檔案定位函數的完整代碼如下所示:
char WriteBuf[1000];
char ReadBuf[100];
CFile file;
file.Open("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);
// 寫入檔案
memset(WriteBuf, 'a', sizeof(WriteBuf));
file.SeekToBegin();
file.Write(WriteBuf, sizeof(WriteBuf));
file.Close();
file.Open("C:\\TestFile.txt", CFile::modeRead);
while (true)
{
//檔案指標
static int position=0;
//移動檔案指標
file.Seek(position,CFile::begin);
// 讀取檔案資料
int ret = file.Read(ReadBuf, 100);
position+=ret;
……
// 如果到達檔案結尾則中止迴圈
if (ret < 100)
break;
}//while
file.Close();