Проверяет ли readdir() заказ?
Я получаю список файлов в Linux-подобной системе, используя opendir/readdir. Похоже, что записи в каталоге возвращаются в алфавитном порядке имени файла. Тем не менее, я не вижу ничего на страницах руководства об этом заказе.
Может ли кто-нибудь сказать мне, не гарантирует ли заказчику заказ?
Ответы
Ответ 1
Метод readdir
не гарантирует никакого заказа. Если вы хотите, чтобы они были отсортированы в алфавитном порядке, вам нужно сделать это самостоятельно.
Примечание. Я искал бит для окончательной документации, говоря, что это так. Ближе всего я пришел к следующей ссылке
Это отнюдь не окончательно, но он дает хороший обзор команды, ее истории и того, как она реализуется, как правило, обходной порядок.
Ответ 2
Короче говоря, нет, readdir() не гарантирует какой-либо конкретный порядок.
из примера readdir в руководстве по glibc
Порядок, в котором файлы появляются в каталоге, имеет тенденцию быть довольно случайным. Более полезная программа сортирует записи (возможно, по алфавиту) перед их печатью
Ответ 3
В "Интерфейс программирования linux":
Имена файлов, возвращаемые readdir(), не отсортированы в порядке сортировки, а
порядок, в котором они происходят в каталоге (это зависит от порядка в
который файловая система добавляет файлы в каталог и как она заполняет пробелы в каталоге
список после удаления файлов). (Команда ls -f перечисляет файлы в том же несортированном
чтобы они были получены readdir().)
Мы можем использовать функцию scandir (3) для получения отсортированного списка файлов, соответствующих
критерии, определяемые программистом; дополнительную информацию см. на странице руководства. Хотя нет
указанный в SUSv3, scandir() предоставляется для большинства реализаций UNIX.
Ответ 4
Это явно не гарантировано. Порядок часто следует некоторым правилам, но правила достаточно сложны, поэтому вы не должны полагаться на них. На заказ могут влиять, например, другие операции, происходящие в одном каталоге, и вы не можете их контролировать. Рассматривайте порядок как случайный, и сортируйте вещи самостоятельно, если вам нужно.
Ответ 5
Нет, readdir не гарантирует никакого заказа.
(Некоторые файловые системы могут хранить записи каталога в определенном порядке, в таких случаях readdir может вернуть их вам в том же порядке, но это не является функцией самого readdir.)
Ответ 6
readdir() не гарантирует, что какой-либо другой порядок выше, чем порядок чтения диска ОС.
В соответствии с тестом, который я сделал на нескольких платформах - Solaris - sun4sol, x86 sol, linux, Windows с образцом кода, все результаты были смещены случайным образом.
source: readdir(), начиная с точек вместо файлов
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main() {
DIR *dir;
struct dirent *dp;
char * file_name;
char dirpath [100] ;
while(1==1){
printf("Choose dir:");
scanf("%s",dirpath);
dir = opendir(dirpath);
while ((dp=readdir(dir)) != NULL) {
if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )
{
// do nothing (straight logic)
} else {
file_name = dp->d_name; // use it
printf("file_name: \"%s\"\n",file_name);
}
}
closedir(dir);
}
return 0;
}
Ответ 7
В дополнение к другим ответам, страница readdir man довольно понятна в отношении упорядочения файлов.
Порядок, в котором имена файлов считываются последовательными вызовами readdir(), зависит от реализации файловой системы; маловероятно, что имена будут отсортированы любым способом.
Некоторые файловые системы, такие как ReiserFS, перечисляют файлы в лексическом порядке.
В вашем случае вам нужно сохранить имена в массиве, а затем отсортировать массив.
Например, для сортировки массива используйте qsort().