Гарантирует ли readdir() заказ?

Я получаю список файлов в Linux-подобной системе, используя opendir / readdir. Похоже, что записи каталога возвращаются в алфавитном порядке имени файла. Тем не менее, я не вижу ничего на страницах руководства о том, что этот заказ гарантирован.

Может кто-нибудь сказать мне, является ли readdir гарантирует заказ?

7 ответов

Решение

readdir метод не гарантирует какого-либо заказа. Если вы хотите, чтобы они были отсортированы в алфавитном порядке, вам нужно сделать это самостоятельно.

Примечание: я искал определенную документацию, говорящую, что это так. Ближайший я пришел по следующей ссылке

Это ни в коем случае не является окончательным, но дает хороший обзор команды, ее истории и того, как ее реализация обычно является порядком обхода.

Короче говоря, нет, readdir() не гарантирует какой-либо конкретный порядок.

из примера readdir в руководстве по glibc

Порядок, в котором файлы появляются в каталоге, имеет тенденцию быть довольно случайным. Более полезная программа сортирует записи (возможно, по алфавиту) перед их печатью.

Из "Интерфейса программирования Linux":

Имена файлов, возвращаемые readdir(), расположены не в порядке сортировки, а в том порядке, в котором они встречаются в каталоге (это зависит от порядка, в котором файловая система добавляет файлы в каталог, и от того, как она заполняет пробелы в список каталогов после удаления файлов). (Команда ls –f выводит список файлов в том же несортированном порядке, в котором они будут извлечены readdir().)

Мы можем использовать функцию scandir(3), чтобы получить отсортированный список файлов, соответствующих критериям, определенным программистом; см. страницу руководства для деталей. Хотя это не указано в SUSv3, scandir() предоставляется в большинстве реализаций UNIX.

Это явно не гарантировано. Порядок часто следует некоторым правилам, но правила достаточно сложны, поэтому вам не следует полагаться на них. Например, на порядок могут повлиять другие операции, происходящие в том же каталоге, и вы не можете ими управлять. Относитесь к порядку как к случайному, и сортируйте вещи самостоятельно, если вам нужно.

Нет, readdir не гарантирует какой-либо заказ.

(Некоторые файловые системы могут хранить записи каталога в определенном порядке, в таких случаях readdir может возвращать их вам в том же порядке, но это не является функцией самого readdir.)

readdir() не гарантирует любой другой порядок выше того, который является порядком чтения диска ОС.


В соответствии с тестом, который я провел на нескольких платформах - Solaris - sun4sol, x86 sol, linux, Windows с примером кода, все результаты отображались случайным образом.


источник: 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;
}

В дополнение к другим ответам, на странице справки readdir достаточно ясно о порядке файлов.

Порядок, в котором имена файлов читаются последовательными вызовами readdir(), зависит от реализации файловой системы; вряд ли имена будут отсортированы каким-либо образом.

Некоторые файловые системы, такие как ReiserFS, перечисляют файлы в лексическом порядке.

В вашем случае вы должны сохранить имена в массиве, а затем отсортировать массив.

Например, используйте qsort() для сортировки массива.

Другие вопросы по тегам