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

MFC FindFirstFile 遍歷順序不固定的原因

     編輯:程式設計疑難解答

現象

使用 FindFirstFile/FindNextFile 遍歷目錄時,返回順序與資源管理器顯示順序不一致(如「新建」文件夾排在「默認」之前)。

官方文檔說明

MSDN 明確指出:FindFirstFile 不對結果排序,返回順序取決於文件系統驅動器的內部結構(如 NTFS 的 B+ 樹遍歷順序),可能與創建時間、文件名哈希等因素相關。

解決方案

  1. 收集後自行排序:將文件信息存入 std::vector,按名稱、時間、大小等排序後再顯示。
  2. 使用 CFileFind 封裝:MFC 的 CFileFind 同樣不保證順序,仍需自行排序。
  3. 示例代碼:
    struct FileInfo { CString name; BOOL isDir; FILETIME createTime; };
    std::vector files;
    CFileFind finder;
    BOOL bWorking = finder.FindFile(strPath + _T("\\*.*"));
    while (bWorking) {
        bWorking = finder.FindNextFile();
        if (finder.IsDots()) continue;
        FileInfo info;
        info.name = finder.GetFileName();
        info.isDir = finder.IsDirectory();
        finder.GetCreationTime(&info.createTime);
        files.push_back(info);
    }
    finder.Close();
    
    // 按名稱排序
    std::sort(files.begin(), files.end(), [](const FileInfo& a, const FileInfo& b) {
        return a.name.CompareNoCase(b.name) < 0;
    });
    

總結

文件系統不保證枚舉順序,應用層必須根據業務需求自行排序,切勿依賴系統返回順序。

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