Visual C++ 開發過程中,編譯器會在專案目錄下產生大量臨時文件(如 .obj、.pch、.idb、.ncb 等),這些檔案不僅佔用磁碟空間,還常導致版本控制衝突。本文分享一個實用的小工具,能遞歸掃描指定目錄,依據通配符精準刪除 VC 產生的垃圾檔案,讓開發環境保持乾淨。
工具的核心是一個遞歸函式 SearchFile,它接受檔案名模式(含通配符)、起始路徑,並將符合條件的完整路徑存入 CStringList。演算法分兩階段:
FindFirstFile/FindNextFile 找出所有符合模式的檔案(排除目錄),取得完整路徑後加入列表。. 和 ..),對每個子目錄遞歸呼叫自身,並在返回前用 SetCurrentDirectory("..") 回到父目錄。CStringList& CDelTempDlg::SearchFile(CString strFileName,
CString strPath,
CStringList &listFileName)
{
char szFullPathName[MAX_PATH];
WIN32_FIND_DATA findData;
SetCurrentDirectory(strPath);
HANDLE hFindHandle = FindFirstFile(strFileName, &findData);
if (hFindHandle != INVALID_HANDLE_VALUE)
{
do
{
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
GetFullPathName(findData.cFileName, MAX_PATH, szFullPathName, NULL);
listFileName.AddTail(szFullPathName);
}
} while (FindNextFile(hFindHandle, &findData));
FindClose(hFindHandle);
}
// 遞歸處理子目錄
hFindHandle = FindFirstFile("*", &findData);
if (hFindHandle != INVALID_HANDLE_VALUE)
{
do
{
if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && findData.cFileName[0] != '.')
{
SearchFile(strFileName, findData.cFileName, listFileName);
SetCurrentDirectory("..");
}
} while (FindNextFile(hFindHandle, &findData));
FindClose(hFindHandle);
}
return listFileName;
}
SHBrowseForFolder + SHGetPathFromIDList 讓使用者圖形化選擇掃描根目錄。GetPrivateProfileInt、WritePrivateProfileString 等 INI 檔操作,支援使用者自訂要清理的副檔名清單(預設包含 *.obj, *.pch, *.idb, *.ncb, *.opt, *.aps 等)。定期執行此工具,即可徹底清除專案目錄下的 VC 臨時檔案,避免磁碟空間不足的彈窗干擾,也能減少版控倉庫體積。原始碼結構簡單,適合作為檔案系統操作的教學範例。