目录遍历,在软件编程中属于常见的需求;如:病毒扫描、源代码编辑、文件比较。在windows环境,使用FindFirstFileEx、FindNextFile(详细情况可以参考MSDN)等文件访问函数,能够实现目录遍历;在posix环境,可以使用open_dir。跨平台不是这里讨论的重点。
ACE提供的opendir_emulation、readdir_emulation函数族与Windows的FindFirstFileEx、FindNextFile功能是一致的;其本意也是提供一种类似接口的跨平台封装。但是,直到版本4.361都还是没有加入其它平台的处理;现在只能认为ACE把一些内存管理包装到自己的函数族中了。
以下的讨论也基于如上的函数实现。
目录的组织可以分成3种情况:
1) 下面也是目录;
2) 下面是文件;
3) ‘.’和‘..’
其中‘.’和‘..’比较特殊,需要过滤。基于上述分析,函数递归调用的算法比较简单。为代码如下:
打开目录;
如果是文件,调用文件处理函数;
如果是目录:
如果目录名是‘.’或者‘..’,继续;
对目录下所有内容:
调用本函数;
读取目录;
清除处理
本文讨论的是:如何基于OO的实现。明显的,如上的递归算法可以封装到一个类中,这是不变的地方;变化的是