尝试在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;
}