【问题标题】:Can't scan directory in order that files appear无法扫描目录以显示文件
【发布时间】:2020-07-30 06:41:15
【问题描述】:

我正在尝试对可以包含子文件夹的文件夹执行 DFS。目标是从目录中找到所有.txt 文件。我需要按照 DFS 找到它们的顺序查找 .txt 文件并保留文件夹中文件的顺序。

目前我用于扫描目录的代码使用scandir() 函数:

int n = scandir(path, &namelist, NULL, alphasort);

这将按字母顺序对文件夹中的文件进行排序,这并不是我想要的。

编辑:我尝试过使用 opendir() 和 readdir() ,但这是以看似随机的顺序访问文件。

【问题讨论】:

  • 你在 Linux 上编程吗?
  • 如果您不想对文件进行排序,scandir() 可能是该工作的错误工具。只使用opendir()readdir()closedir() 有什么问题?
  • 要使用versionsort #define _GNU_SOURCE 需要在#include <dirent.h> 之前
  • 您说“保留文件夹中文件的顺序”,但您讨论了对文件夹中文件名称进行排序的不同方法。这令人费解——你想要哪个?以某种方式排序或“物理顺序”?如果您想要排序,那么scandir() 是一个不错的选择。如果你想要“物理顺序”,那是错误的选择。你到底在追求什么?您还提到了 DFS — 深度优先搜索。您是否应该查看nftw() 的“(新)文件树遍历”?请通过在问题中编辑一些额外信息来阐明您的要求。
  • 我很抱歉不清楚这一点。我的意思是按照文件出现的顺序遍历文件夹。我不知道如何描述这个订单。我也使用了 opendir() 和 readdir() 但这仍然是乱序访问文件。具体来说,我有文件夹 F1, F2, ... , F10 但它按 F4,F1,F5,F10,F,F8,F9,F2,F3,F7 的顺序访问它们

标签: c linux scandir


【解决方案1】:

根据versionsort man page

int versionsort(const void *a, const void *b);

可以作为回调传递给scandir(),并在dirent.h 中声明。


首先要检查:“功能测试宏要求”

来自上面链接的同一页面:

glibc 的功能测试宏要求(参见 feature_test_macros(7)):

scandir(), alphasort(): _BSD_SOURCE || _SVID_SOURCE

versionsort(): _GNU_SOURCE。

这些宏需要在 dirent.h 包含之前定义,以启用特定功能。


第二件事要检查:glibc 版本

来自上面链接的同一页面:

版本

versionsort() 在 2.1 版本中被添加到 glibc。

请参考this question 了解如何检查您的 glibc 版本。

【讨论】:

  • 这是关于如何声明 versionsort() 等的好建议,但问题还说“保留文件夹中文件的顺序”。使用alphasort()versionsort() 本身就可以解决这个问题——目标必须是“不排序”。目前尚不清楚如何实现“无排序”。比较两个指针(通过uintptr_t 作为数字)并猜测目录中较早的指针出现在后面的指针之前可能是可行的,但这绝非确定。对scandir() 要求free(namelist) 释放所有分配的内存非常严格。
  • @JonathanLeffler 我将问题解释为versionsort() 实际上是他们正在寻找的。来自here" [versionsort()] [...] 使用 strverscmp(3) 对字符串 (*a)->d_name 和 (*b)->d_name 进行排序。" 这样,例如 "jan1 。这不是文件呈现的典型顺序吗?可能你是对的,我应该等待 OP 的进一步澄清。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2015-01-18
  • 2011-06-28
相关资源
最近更新 更多