【发布时间】:2010-02-22 15:57:39
【问题描述】:
C 例程 opendir()、readdir() 和 closedir() 为我提供了一种遍历目录结构的方法。但是,readdir() 返回的每个 dirent 结构似乎都没有为我提供一种有用的方法来获取指向 DIR 的指针集,我需要递归到目录子目录中。
当然,他们给了我文件的名称,所以我可以将该名称附加到目录路径和 stat() 和 opendir() 它们,或者我可以通过 chdir( ) 并通过 chdir("..") 回滚。
第一种方法的问题是,如果目录路径的长度足够大,那么将包含它的字符串传递给 opendir() 的成本将超过打开目录的成本。如果您更理论一点,您可以说您的复杂性可能会增加超过线性时间(在目录树中(相对)文件名的总字符数中)。
另外,第二种方法也有问题。由于每个进程都有一个当前工作目录,因此除了一个线程之外的所有线程都必须在多线程应用程序中阻塞。另外,我不知道当前工作目录是否只是为了方便(即,在文件系统查询之前,相对路径将附加到它上面)。如果是这样,这种方法也将是低效的。
我接受这些功能的替代品。那么如何高效地遍历 UNIX 目录树(其下文件的总字符数的线性时间)?
【问题讨论】:
-
文件名或子目录的最大长度由 MAXCOMPLEN 设置,传统上是 255,几乎不会超过 512。因此,如果你让你的函数递归,你肯定不会有很大的字符串分配和管理包含目录路径的字符串会影响遍历的整体复杂性。
标签: c filesystems readdir traversal closedir