linux readdir对结果排序,c-readdir()是否保证顺序?

c-readdir()是否保证顺序?

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

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

Tom asked 2020-01-27T19:39:13Z

7个解决方案

41 votes

readdir方法不保证任何排序。 如果要确保按字母顺序对它们进行排序,则需要自己进行。

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

[http://utcc.utoronto.ca/~cks/space/blog/unix/ReaddirOrder]

它决不是绝对的,但确实可以很好地概述该命令,它的历史以及它的实现方式(通常是遍历顺序)。

JaredPar answered 2020-01-27T19:39:50Z

13 votes

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

来自glibc手册中的readdir示例

文件在目录中的显示顺序通常相当   随机。 一个更有用的程序将对条目进行排序(也许通过   按字母顺序排列),然后再打印

Joachim Isaksson answered 2020-01-27T19:40:19Z

10 votes

来自“ Linux编程接口”:

readdir()返回的文件名不是按排序顺序,而是按它们在目录中发生的顺序(取决于顺序哪个文件系统将文件添加到目录中以及如何填充目录中的空白删除文件后列出)。 (命令ls –f列出未排序的文件。以便通过readdir()检索它们。)

我们可以使用函数scandir(3)检索匹配文件的排序列表程序员定义的标准; 有关详细信息,请参见手册页。 虽然没有在SUSv3中指定的情况下,大多数UNIX实现中都提供了scandir()。

efannu-723 answered 2020-01-27T19:40:49Z

8 votes

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

answered 2020-01-27T19:41:09Z

6 votes

不,readdir不保证任何顺序。

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

nos answered 2020-01-27T19:41:34Z

2 votes

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

根据我在几个平台(Solaris),sun4sol,x86 sol,linux,Windows和示例代码上进行的测试,所有结果均以随机方式显示。

源:readdir()以点而不是文件开头

#include

#include

#include

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;

}

Wojciech Papaj answered 2020-01-27T19:42:03Z

1 votes

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

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

某些文件系统(例如ReiserFS)的确以词法顺序列出文件。

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

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

Ring Ø answered 2020-01-27T19:42:41Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值