【问题标题】:sorted glob in C/linuxC / linux中的排序全局
【发布时间】:2011-12-23 03:11:20
【问题描述】:

我需要在目录中找到最新创建/修改的文件。基本上是ls -t *.bla 所做的。在 C 中,而不是 PHP 中,所以这个问题对我没有帮助 - glob() - sort by date


这是一个不应该做的例子(fork 一个进程并不便宜,它很懒惰):

char filename[100];
FILE *f = popen("ls -1t /*.blabla");
fscanf(f, "%s", filename);
pclose(f);

?

【问题讨论】:

    标签: c directory glob


    【解决方案1】:

    使用opendir() 打开目录,将文件名 (readdir()) 读入数组,然后在该数组上执行qsort() 并使用stat() 读取创建或修改日期然后反过来用告诉qsort()如何排序。不要忘记使用closedir() 关闭目录(根据以下 larsmans 评论中提出的修改,这可能会更加有效)。

    最后在排序完成后,取第一个/最后一个数组条目(取决于你的排序方式),你就完成了。

    如果可用,您也可以只使用scandir() 一次性完成所有这些(尽管您不会绕过必要的更多 stat() 调用,因为这些需要在 qsort 的比较回调中为此解决方案完成) .

    PS:有人知道如何以原子方式执行此操作吗?

    【讨论】:

    • 由于所有stat 调用,这也很昂贵。最好设置一个 struct stat/filename 对数组并对其进行排序。
    • 您还可以提高效率,因为您只需要最后几个修改过的文件(无需对整个列表进行排序)。尽管如此,我们甚至不知道效率在这里是否重要,所以这很好。告诉我们 qsort 是在哪里定义的(我们需要什么头文件和库?)
    • @David Grayson qsort() 的原型应该在 stdlib.h 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2011-01-14
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多