Гарантирует ли readdir () заказ? - PullRequest
49 голосов
/ 23 января 2012

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

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

Ответы [ 7 ]

40 голосов
/ 23 января 2012

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

Примечание. Я немного искал документацию, подтверждающую, что это так.Самое близкое, что я получил, это следующая ссылка

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

13 голосов
/ 23 января 2012

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

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

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

9 голосов
/ 24 января 2012

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

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

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

8 голосов
/ 23 января 2012

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

6 голосов
/ 23 января 2012

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

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

2 голосов
/ 11 февраля 2015

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;
}
1 голос
/ 27 ноября 2017

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

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

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

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

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

...