我使用opendir / readdir在类似linux的系统上获取文件列表。看来目录条目按文件名的字母顺序返回。但是,我在手册页中没有看到关于此订单的任何内容。
有人能告诉我readdir是否保证订单?
答案 0 :(得分:40)
readdir
方法并不保证任何排序。如果您想确保按字母顺序排序,您需要自己完成。
注意:我搜索了一些确切的文档说这是事实。我最接近的是以下链接
它绝不是决定性的,但它确实对命令,它的历史以及它的实现通常是遍历顺序提供了很好的概述。
答案 1 :(得分:13)
简而言之,不,readdir()不保证任何特定的订单。
中的readdir示例文件在目录中出现的顺序趋于合理 随机。一个更有用的程序会对条目进行排序(也许是通过 在打印之前按字母顺序排列
答案 2 :(得分:9)
来自“linux编程接口”:
readdir()返回的文件名不是按排序顺序,而是在 它们碰巧发生在目录中的顺序(这取决于它的顺序) 文件系统将文件添加到目录以及它如何填充目录中的空白 删除文件后的列表)。 (命令ls -f列出相同未排序的文件 命令它们将被readdir()检索。)
我们可以使用函数scandir(3)来检索匹配的文件的排序列表 程序员定义的标准;有关详细信息,请参见手册页。虽然没有 在SUSv3中指定,在大多数UNIX实现中都提供了scandir()。
答案 3 :(得分:8)
明确无法保证。排序通常遵循一些规则,但规则很复杂,你不应该依赖它们。例如,排序可能会受到同一目录中发生的其他操作的影响,您无法控制这些操作。将排序视为随机排序,并在需要时自行排序。
答案 4 :(得分:6)
不,readdir不保证任何订单。
(某些文件系统可能按特定顺序存储目录条目,在这种情况下,readdir可能会以相同的顺序将它们返回给您,但这不是readdir本身的功能。)
答案 5 :(得分:2)
readdir()不保证任何其他顺序高于OS磁盘读取顺序。
根据我在几个平台上进行的测试 - Solaris - sun4sol,x86 sol,linux,带有示例代码的Windows,所有结果都是随机排列的。
来源:readdir() beginning with dots instead of files
#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;
}