在 Windows 平台下進行文件操作時,MFC 的 CFile 類提供了方便的封裝。本文示範如何使用 CFile 實現一個健壯的文件拷貝程式,包含完整的錯誤處理機制。
#include <iostream>
#include <afx.h>
int main()
{
char sourceName[81];
char destName[81];
std::cout << "請輸入源文件名:";
std::cin >> sourceName;
std::cout << "請輸入目標文件名:";
std::cin >> destName;
try
{
// 以唯讀模式開啟源文件
CFile fileSource(sourceName, CFile::modeRead);
// 建立目標文件,若存在則覆蓋
CFile fileDest(destName, CFile::modeCreate | CFile::modeWrite);
char buffer;
// 逐位元組讀寫
while (fileSource.Read(&buffer, 1))
{
fileDest.Write(&buffer, 1);
}
std::cout << "文件拷貝完成!" << std::endl;
}
catch (CFileException* e)
{
switch (e->m_cause)
{
case CFileException::fileNotFound:
std::cerr << "錯誤:未找到文件!" << std::endl;
break;
case CFileException::badPath:
std::cerr << "錯誤:路徑輸入有誤!" << std::endl;
break;
case CFileException::accessDenied:
std::cerr << "錯誤:沒有訪問權限!" << std::endl;
break;
case CFileException::diskFull:
std::cerr << "錯誤:磁碟空間不足!" << std::endl;
break;
default:
std::cerr << "錯誤:文件拷貝過程中發生未知錯誤!" << std::endl;
break;
}
e->Delete(); // 釋放異常物件
}
return 0;
}
try-catch 捕捉 CFileException,根據 m_cause 成員判斷具體錯誤類型。CFile 的解構函式會自動關閉文件句柄,符合 RAII 原則。modeRead、modeCreate、modeWrite 組合確保目標文件可寫入且不存在時自動建立。對於大文件,建議修改讀寫邏輯:
constexpr size_t BUFFER_SIZE = 4096;
char buffer[BUFFER_SIZE];
UINT bytesRead;
while ((bytesRead = fileSource.Read(buffer, BUFFER_SIZE)) > 0)
{
fileDest.Write(buffer, bytesRead);
}
這樣可大幅減少系統呼叫次數,提升拷貝速度。
此範例適用於 MFC 專案或需使用 MFC 類庫的 Win32 應用程式。若為標準 C++ 專案,建議改用 std::ifstream/std::ofstream 或 C++17 的 std::filesystem::copy_file。