使用 C++ 直接呼叫 Windows API 實現檔案拷貝與目錄同步,比 C# 的 File/Directory 類別更貼近系統底層,能深入理解檔案系統操作本質。本文分享一個基於 MFC/ATL 風格的同步資料夾實現,並反思開發過程中的關鍵心得。
SyncFolder - 同步協調器
namespace Common { namespace File {
class SyncFolder : public FileClass {
private:
std::wstring m_sourceDirectory;
std::wstring m_targetDirectory;
const std::wstring* m_ext; // 擴展名過濾
const bool* m_reverseExt; // 反向過濾旗標
protected:
virtual void FileMethod(const std::wstring& fileName); // 每個檔案的處理邏輯
public:
SyncFolder(const std::wstring& src, const std::wstring& dst,
const std::wstring& ext, bool reverseExt);
~SyncFolder();
void Exec(); // 啟動同步
};
}}
void SyncFolder::Exec() {
ReadFiles(m_sourceDirectory, *m_ext); // 遍歷來源目錄
}
void SyncFolder::FileMethod(const std::wstring& fileName) {
// 1. 計算相對路徑
std::wstring offsetPath = GetRelativePath(m_sourceDirectory,
GetPathFromFilePath(fileName));
// 2. 組合目標路徑
std::wstring targetFilePath = offsetPath.empty() ?
m_targetDirectory : m_targetDirectory + L"\\" + offsetPath;
// 3. 建立目標目錄
CreatePath(targetFilePath);
// 4. 完整目標檔案路徑
std::wstring newFileName = targetFilePath + L"\\" + GetFileNameFromFilePath(fileName);
// 5. 拷貝檔案 (Windows API)
CopyFile(fileName.c_str(), newFileName.c_str(), TRUE); // TRUE = 不覆蓋既有
}
C++ 成員函數指標帶有 this 指標,無法直接作為 C 風格函數指標傳遞給遍歷函數。
&SyncFolder::FileMethodFileMethod,基類遍歷函數呼叫虛擬函數,衍生類別覆寫實現具體邏輯 (Template Method 模式)DataTable 等弱型別容器,C++ 模板容器提供編譯期保證GetSecurePath:路徑規範化、處理 ..、尾端斜線GetRelativePath:計算兩路徑相對關係GetPathFromFilePath/GetFileNameFromFilePath:路徑分解CreatePath:遞迴建立多層目錄 (SHCreateDirectoryEx 或 CreateDirectory 迴圈)ReadFiles:FindFirstFile/FindNextFile 遞迴遍歷,支援擴展名過濾「C++ 的學習讓我受益匪淺。嚴格的型別系統、編譯器即文檔、手動資源管理迫使設計更清晰的所有權模型、單元測試文化的萌芽——這些經驗轉移到 C# 開發中,反而讓重構更從容、架構更健壯。」
直接操作 Win32 API 雖繁瑣,卻能建立對作業系統檔案系統、記憶體管理、錯誤處理機制的直觀理解,是系統級程式設計師的必修課。