使用 MFC 的 FindFirstFile 遍歷目錄時,期望獲取第一個有效文件名,彈出的消息框卻顯示 "."。代碼片段如下:
void TreeView::FindFirstFolder(CString strName, WIN32_FIND_DATAA& data) {
WIN32_FIND_DATAA s;
FindFirstFile(strName, &s);
AfxMessageBox(s.cFileName); // 顯示 "."
}
調用方式:FindFirstFolder("H:\\...\\*.*", data);
Windows 文件系統中,每個目錄默認包含兩個特殊項目:
. 代表當前目錄.. 代表父目錄FindFirstFile 按文件系統順序返回,這兩個項目永遠排在最前面。這在命令行執行 dir 時也能直觀看到。
必須在循環中跳過這兩個特殊項目:
WIN32_FIND_DATAA findData;
HANDLE hFind = FindFirstFile(strName, &findData);
if (hFind != INVALID_HANDLE_VALUE) {
do {
// 跳過 "." 和 ".."
if (strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0)
continue;
// 處理有效文件...
} while (FindNextFile(hFind, &findData));
FindClose(hFind);
}
切記:FindFirstFile 只是打開遍歷句柄,真正的遍歷靠 FindNextFile,且必須配合 FindClose 釋放資源。