【发布时间】:2009-05-22 16:30:57
【问题描述】:
我正在寻找一个可移植的文件系统扫描器,能够递归地列出给定目录路径上的所有文件。
为此,我尝试将 cygwin 用于我的编译器,使用 dirent.h 并使用模板:
#include <dirent.h>
#include <stdio.h>
int main(void)
{
DIR *d;
struct dirent *dir;
d = opendir(".");
if (d)
{
while ((dir = readdir(d)) != NULL)
{
// Stuff
}
closedir(d);
}
return(0);
}
但还需要添加递归目录搜索。为此,我的解决方案是尝试在下一个文件上 opendir(),并判断错误代码以确定它是否作为目录成功打开(然后我将对其进行递归),或者它是否返回为 'not一个目录',然后它会被列为一个文件。
我承认感觉很笨拙,但我一直找不到更好的方法来保留一些可移植性(不是 win32),即使经过数小时的搜索。
所以我的简化解决方案(为了简单起见有些伪)看起来像这样:
整数扫描(字符串 startdir) { 目录 *d; 结构 dirent *dir; d = opendir(startdir.cstr()); 如果 (d) { 而 ((dir = readdir(d)) != NULL) { if( 不是 '.' 而不是 '..') { 如果(temp = opendir(startdir + d)== NULL) { //文件或错误 }别的{ //作为目录打开成功,所以递归 扫描(开始目录 + d->d_name + “\\”); } } } 关闭(d); } 返回(0); }这只是为了保持简单而重写了一半的伪代码,但它似乎有效(尽管我非常愿意接受有关更好方法的建议)。
然而,我遇到的主要问题是一个特定的链接文件“c:\cygwin\dev\fd”,它似乎作为一个目录打开,并以递归方式一遍又一遍地无限地打开。
“fd”文件为 4KB,106 字节,无扩展名,是一个快捷方式,不指向 Windows 中的任何位置。
这个错误似乎表明这个 kludgey 方法有问题,或者我正在编译的 cygwin 实现中存在问题。
作为一个简短的例子:
错误读取:c:\cygwin\dev\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd \5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5 \fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd \5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5 \fd\5\fd\0 没有那个文件或目录
排除该目录,搜索似乎运行良好。但是我不同意将排除项硬编码到扫描仪中。
如果有人对此问题有任何想法、建议、解决方案或替代方法,我们将不胜感激。
谢谢。
【问题讨论】:
标签: c++ recursion filesystems cygwin