Как все отметили, FindFirstFile()
не сортирует и не может отсортировать возвращаемые файлы. Он работает на довольно низком уровне и возвращает файлы в порядке, который соответствует естественному порядку записей файловой системы в каталоге.
На диске, отформатированном с использованием файлов FAT и FAT32, этот порядок будет сильно зависеть от порядка, в котором файлы были созданы, изменены путем удаления файлов и возможного повторного использования теперь пустых слотов записей каталога. Это связано с тем, что каталоги FAT (как и во многих файловых системах Unix) представляют собой просто упакованный массив структур записей каталога фиксированного размера вместе с уродливым хаком для размещения длинных имен файлов, написанных в Unicode, в структуре каталогов, предназначенной для имен 8.3, написанных в ASCII. В отличие от Unix, вызовы Win32 API необходимы для чтения записей каталога, но это не влияет на порядок чтения записей.
В NTFS (насколько я понимаю) каталоги представлены в некотором варианте B-дерева, и поэтому естественный порядок файлов, видимый Win32 API, связан с индексированием, естественным для этой структуры данных.
Различия можно увидеть с помощью команды DIR
в командной строке. На томе FAT32 DIR
показывает файлы в другом порядке, чем если бы эта же папка была скопирована на том NTFS. DIR /ON
должен перечислять файлы в том же порядке независимо от используемой базовой файловой системы.
Ни один не отсортированный порядок, созданный DIR, не совпадает с порядком, созданным в проводнике Windows при сортировке по имени. (Впрочем, DIR /ON
тоже не то же самое.)
Проводник Windows использует независимую от регистра сортировку, которая также, похоже, игнорирует некоторые знаки препинания в сортировке и пытается быть умнее с числами. В частности, простое использование qsort()
с stricmp()
не даст тот же ответ, что и Explorer. Неясно, задокументирован ли где-либо фактический порядок сортировки, используемый проводником или DIR.
Например, следующие имена сортируются в DIR следующим образом:
C:\temp\test> dir/on/b
aoli.txt
a-one.txt
atwo.txt
b1.txt
b10.txt
b2.txt
b-20.txt
b21.txt
b3.txt
b-4.txt
но транскрибируя из Проводника, отсортированного в столбце Имя, они в следующем порядке:
aoli.txt
a-one.txt
atwo.txt
b1.txt
b2.txt
b3.txt
b10.txt
b21.txt
b-4.txt
b-20.txt
У меня проблемы с представлением простого применения функции сравнения для получения последнего эффекта.