首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC FindFirstFile 陷阱:為什麼首個文件總是 "."?

     編輯:程式設計疑難解答

現象還原

使用 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 釋放資源。

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