尝试在C中递归打开子目录时出现问题
我正在做一个作业,它将列出当前目录(.)中的目录,并递归地打开子目录并打印出它们的文件内容 我遇到了一个奇怪的问题,我的子目录打开了,但是出于某种原因,它没有打印这些子目录中的文件内容,而是将子目录中的每个文件作为目录打开,从而导致错误 例如,如果我这样做:尝试在C中递归打开子目录时出现问题,c,recursion,directory,C,Recursion,Directory,我正在做一个作业,它将列出当前目录(.)中的目录,并递归地打开子目录并打印出它们的文件内容 我遇到了一个奇怪的问题,我的子目录打开了,但是出于某种原因,它没有打印这些子目录中的文件内容,而是将子目录中的每个文件作为目录打开,从而导致错误 例如,如果我这样做:$./ls. 我的输出应该如下所示(注意,是我的当前目录): 相反,我将此作为我的输出: . file_name.c file_2.c sub_directory_1 Error while openi
$./ls.
我的输出应该如下所示(注意,
是我的当前目录):
相反,我将此作为我的输出:
.
file_name.c
file_2.c
sub_directory_1
Error while opening directory file_3.c: No such file or directory
sub_directory_2
Error while opening directory main.c: No such file or directory
Error while opening directory test.c: No such file or directory
file_4.c
这是我当前的递归方法。我只是不明白为什么它会打印出当前目录中的文件,而不是子目录中的条目
void ls_directory(char *dir_name, int level)
{
DIR *p_dir = NULL; // pointer to a directory
struct dirent *p_entry; // pointer to a directory entry
if(!(p_dir = opendir(dir_name)))
{
fprintf(stderr, "Error while opening directory %s: %s\n", dir_name, strerror(errno));
return;
}
printf("%s\n", dir_name);
while((p_entry = readdir(p_dir)))
{
if(is_dir(p_entry->d_name) == DIRECTORY)
{
// do not list the parent directories
if(strcmp(p_entry->d_name, ".") != 0 && strcmp(p_entry->d_name, "..") != 0){
ls_directory(p_entry->d_name, level + 1);
}
} else {
ls_file(p_entry->d_name);
printf("\n");
}
}
closedir(p_dir);
}
请注意,ls\u file()
只打印语句。的代码是_dir()
只是检查它是否是一个目录,如果是,则返回一个预定义的值,如果不是,则返回0
int is_dir(char *file_name)
{
stat(file_name, &sb);
if(S_ISDIR(sb.st_mode))
return DIRECTORY;
return 0;
}
上次我选中的
opendir
和stat
都需要当前工作目录中的名称或完整路径。您的递归既不提供,也不提供。@WhozCraig您是说stat
和opendir
都不需要目录名进行检查吗?或者你是说它们都需要一个工作目录或完整路径?不,我是说当你从一个给定的工作目录运行它时,你递归到的任何目录都需要预先编译到d_name
,然后再使用适当的分隔符进行检查。一个完整的路径是可行的,但是除非你用getcwd
开始,否则这是不可行的。一旦你对sub\u目录\u 1
进行递归,并且opendir
你将在列表中得到file\u 3.c
,但是file\u 3.c
不在当前工作目录中,因此调用stat(file\u 3.c)
将失败。这同样适用于任何潜艇。您需要构建每个递归的路径或setcwd
进入并返回。我希望这更清楚。因为您的目录检查使用stat
,是的,您需要构建的路径。对不起,我忘了。请记住,从读取器
返回的每个元素都与传递给opendir
的路径相关。如果要stat
它,它需要该路径,否则stat
将不知道在哪里找到它。再一次,很抱歉我漏掉了。这将为你打开一条完整的道路。
int is_dir(char *file_name)
{
stat(file_name, &sb);
if(S_ISDIR(sb.st_mode))
return DIRECTORY;
return 0;
}