53

我正在使用 opendir/readdir 获取类 linux 系统上的文件列表。似乎目录条目是按文件名的字母顺序返回的。但是,我在手册页中没有看到任何关于保证此订单的内容。

谁能告诉我 readdir 是否保证订单?

4

7 回答 7

48

readdir方法不保证任何排序。如果你想确保它们按字母顺序排序,你需要自己这样做。

注意:我搜索了一些明确的文档,说是这种情况。我最接近的是以下链接

它绝不是确定的,但它确实很好地概述了命令、它的历史以及它的实现通常是如何遍历顺序的。

于 2012-01-23T19:34:15.390 回答
14

简而言之,不,readdir() 不保证任何特定的顺序。

来自glibc 手册中的 readdir 示例

文件出现在目录中的顺序往往是相当随机的。一个更有用的程序会在打印条目之前对条目进行排序(可能按字母顺序排列)

于 2012-01-23T19:37:33.327 回答
12

来自“Linux编程接口”:

返回的文件名readdir()不是按顺序排列的,而是按它们在目录中出现的顺序(这取决于文件系统将文件添加到目录的顺序以及它如何填补目录列表中的空白之后)文件被删除)。(该命令ls –f以相同的未排序顺序列出文件,它们将由 检索readdir()。)

我们可以使用该函数scandir(3)来检索符合程序员定义标准的文件的排序列表;有关详细信息,请参阅手册页。尽管在 SUSv3 中未指定,scandir()但在大多数 UNIX 实现中提供。

注意:scandir 是 POSIX.1-2008 的一部分。readdirFreeBSD libc中定义了一个允许版权保护的版本。

于 2012-01-24T09:56:42.937 回答
9

明确不保证。排序通常遵循一些规则,但规则足够复杂,您不应该依赖它们。例如,排序可能会受到同一目录中发生的其他操作的影响,而您无法控制这些操作。将排序视为随机排序,并在需要时自行排序。

于 2012-01-23T19:34:57.180 回答
8

不,readdir 不保证任何顺序。

(某些文件系统可能会以特定顺序存储目录条目,在这种情况下 readdir 可能会以相同的顺序将它们返回给您,但这不是 readdir 本身的功能。)

于 2012-01-23T19:36:23.347 回答
3

readdir() 不保证 OS 磁盘读取顺序之上的任何其他顺序。


根据我在几个平台上进行的测试 - 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;
}
于 2015-02-11T13:03:00.837 回答
1

除了其他答案之外,readdir 手册页对文件排序非常清楚。

连续调用 readdir() 读取文件名的顺序取决于文件系统的实现;名称不太可能以任何方式排序。

一些文件系统,如 ReiserFS 确实按词法顺序列出文件。

在您的情况下,您必须将名称存储在数组中,然后对数组进行排序。

例如,使用qsort()对数组进行排序。

于 2017-11-27T14:39:45.417 回答