我正在开发一个简单的项目来实现" 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;
答案 0 :(得分:1)
您需要包含相对于程序当前目录的路径。每个nameList
元素都必须为dirName
+ "/"
+ directory->d_name
。
如果您开始在本地目录上调用lsR
,./foo
和foo
下面有名为bar
的目录,那么打开bar
您需要的打开./foo/bar
,因为您的程序是从.
所代表的目录运行的。
答案 1 :(得分:1)
在当前目录中的文件列表中,您注意到.
和..
第一个是当前目录的硬链接,第二个是父目录的硬链接。因此,当您通过dir条目进行递归时,您将希望跳过这两个条目。否则,您将递归到的第一个目录将是.
,换句话说就是您刚刚经过的目录。
这就是你的程序当前行为的原因,但是一旦你解决了这个问题,你将遇到他的答案中提到的潜伏问题。
附加说明:
char **nameList[MAX_RECURSIVE_FILES];
变量吗?在我看来,您想要一个char *
数组,而不是char **
数组。S_ISDIR
结构的st_mode
字段上使用stat
宏,以检查当前文件不是目录而不是自定义函数?