首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 使用 MFC CFile 類實現文件拷貝完整範例

     編輯:關於C++

C++ 文件拷貝實作:基於 MFC CFile 類的完整範例

在 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 原則。
  • 逐位元組拷貝:範例採用單位元組讀寫,教學用途清晰;實際專案建議使用緩衝區(如 4KB)提升效能。
  • 模式旗標: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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved