使用 scandir 并按大小排序

Using scandir and sorting by size

用 C 写一个类似于 ls 的程序。我的程序需要实现 -S 标志,这意味着它根据内​​容的大小(以字节为单位)对指定的任何目录(如果没有,则为当前目录)进行排序。

显然,您可以使用 scandir 和 alphasort 轻松地按字母顺序排序(参见 https://www.cs.cf.ac.uk/Dave/C/node20.html)。我的问题是您是否可以将 scandir 与比较器函数一起使用,该函数比较两个条目的内容大小。

或者,我可以只为比较器函数指定 NULL,得到未排序的数组,然后自己使用 qsort() 函数对其进行排序。

非常感谢任何建议。需要任何澄清,请在评论中说。

正在将评论转换为答案。

因为 scandir() 的 POSIX 声明是

int scandir(const char *dir, struct dirent ***namelist,
            int (*sel)(const struct dirent *),
            int (*compar)(const struct dirent **, const struct dirent **));

可以编写一个比较器函数,在两个指向的目录条目中的每一个上使用stat(),并以你认为合适的任何方式比较大小。困难在于缓存 stat 数据;没有明显的方法可以做到这一点,但是如果您有数千个文件,您可能不希望每次进行比较时都进行 运行 两次 stat() 系统调用 — 那将是几乎是 'slow compare vs fast swap'.

的终极版

I was thinking of that, but then I thought that a lot of work would be done for even a few hundred files. Any suggestions?

我可能会使用一个简单的比较器(也许 alphasort()),然后当 scandir() 返回数据时,创建一个数据结构数组,该数组可以缓存文件名和大小(以及您想要用于比较的任何其他数据),然后在数据结构的数组上使用 qsort()