使用 FindFirstFile/FindNextFile 遍歷目錄時,返回順序與資源管理器顯示順序不一致(如「新建」文件夾排在「默認」之前)。
MSDN 明確指出:FindFirstFile 不對結果排序,返回順序取決於文件系統驅動器的內部結構(如 NTFS 的 B+ 樹遍歷順序),可能與創建時間、文件名哈希等因素相關。
std::vector,按名稱、時間、大小等排序後再顯示。CFileFind 同樣不保證順序,仍需自行排序。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;
});
文件系統不保證枚舉順序,應用層必須根據業務需求自行排序,切勿依賴系統返回順序。