使用opendir(),readdir()和closedir()有效地遍历目录树

C程序opendir(),readdir()和closedir()为我提供了一种遍历目录结构的方式.然而,readdir()返回的每个dirent结构似乎并没有提供一个有用的方式来获取一组指向DIR的指针,我需要将它们递归到目录子目录中.

当然,他们给了我这个文件的名字,所以我可以把这个名字追加到目录路径和stat()和opendir()中,或者我可以通过chdir()和roll来改变进程的当前工作目录它通过chdir(“..”)返回.

第一种方法的问题是,如果目录路径的长度足够大,那么将包含它的字符串传递给opendir()的代价将超过打开目录的成本.如果你有更多的理论,你可以说你的复杂度可以超过线性时间(在目录树中的(相对)文件名的总字符数)中.

另外,第二种方法有问题.由于每个进程具有单个当前工作目录,所以除了一个线程之外,所有线程都必须在多线程应用程序中阻塞.此外,我不知道当前工作目录是否仅仅是方便(即在文件系统查询之前相对路径将附加到它).如果是这样,这种做法也是无效的.

我接受这些功能的替代方案.那么它如何可以有效地遍历UNIX目录树(在其下的文件的总字符数的线性时间)?

最佳答案
你有没有试过ftw()aka文件树步行?

狙击手3 ftw:

int ftw(const char * dir,int(* fn)(const char * file,const struct stat * sb,int flag),int nopenfd);

ftw() walks through the directory tree starting from the indicated directory dir. For each found entry in the tree, it calls fn() with the full pathname of the entry, a pointer to the stat(2) structure for the entry and an int flag

转载注明原文:使用opendir(),readdir()和closedir()有效地遍历目录树 - 代码日志