从头开始写ls递归

时间:2014-05-05 17:42:29

标签: c linux directory

我正在开发一个简单的项目来实现" ls -R"从头开始。每当我运行我所拥有的东西时,我的程序就会一遍又一遍地搜索根目录。我做错了什么?

void lsR(char dirName[]) {
/*
The recursive function call.  
*/

DIR *dir;
struct dirent *directory;
struct stat fileStat;
char type;
char **nameList[MAX_RECURSIVE_FILES];
struct passwd *user;
int count = 0;
int i = 0;


printf("\n");
printf("./%s :\n", dirName);
printf("\n");


if ((dir = opendir(dirName)) == NULL) {
    perror("opendir error:");
    return;
}

while ((directory = readdir(dir)) != NULL) {


    if (stat(directory->d_name, &fileStat) < 0) {
        perror("fstat error:");
        return;
    }
    if (fileStat.st_uid == 1) {
        continue;
    }

    user = getpwuid(fileStat.st_uid);
    printf("%s ", directory->d_name);

    fileType(&fileStat, &type);
    if ((type == 'd') && (count < MAX_RECURSIVE_FILES)) {

        nameList[count] = malloc(sizeof(char)*MAX_STRING_LENGTH);
        strncpy(nameList[count++], directory->d_name, MAX_STRING_LENGTH);
    }

}
closedir(dir);
printf("\n");
for (i=0; i<count; i++) {
    printf("Calling lsR on: %s\n", nameList[i]);
    lsR(nameList[i]);
}

}

执行时,我得到以下输出:

&#34; ./。 :

。,..,...我当前工作目录中的所有其他文件......

./。 :

。,..,...我当前工作目录中的所有其他文件......

&#34;

2 个答案:

答案 0 :(得分:1)

您需要包含相对于程序当前目录的路径。每个nameList元素都必须为dirName + "/" + directory->d_name

如果您开始在本地目录上调用lsR./foofoo下面有名为bar的目录,那么打开bar您需要的打开./foo/bar,因为您的程序是从.所代表的目录运行的。

答案 1 :(得分:1)

在当前目录中的文件列表中,您注意到...第一个是当前目录的硬链接,第二个是父目录的硬链接。因此,当您通过dir条目进行递归时,您将希望跳过这两个条目。否则,您将递归到的第一个目录将是.,换句话说就是您刚刚经过的目录。

这就是你的程序当前行为的原因,但是一旦你解决了这个问题,你将遇到他的答案中提到的潜伏问题。

附加说明:

  • 您确定char **nameList[MAX_RECURSIVE_FILES];变量吗?在我看来,您想要一个char *数组,而不是char **数组。
  • 您是否知道可以在S_ISDIR结构的st_mode字段上使用stat宏,以检查当前文件不是目录而不是自定义函数?