Проверяет ли 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().