打印目录及其子目录中的所有文件

时间:2016-11-02 13:42:24

标签: c file directory

我的目标是打印目录及其子目录中的所有文件。如果路径是文件,我打印出路径。但是,如果路径是目录,那么我递归调用pathInfo(pathnm),其中pathnm是路径。我的理由是,它最终将到达最后一个目录,在这种情况下,它将打印该目录中的所有文件。当它向最后一个目录前进时,它将连续打印出它遇到的文件。最终,将打印给定路径目录及其子目录中的所有文件。

问题是在运行时,程序无法打印文件名。相反,它会打印连续的垃圾线,例如/Users/User1//././././././././././././。这会发生,直到程序退出时出现错误progname: Too many open files

我希望得到关于我做错了什么的输入以及我如何解决它以便程序以我描述的方式运行。请以对编程新手明确的方式构建您的答案。

谢谢。

路径信息功能

#include "cfind.h"

void getInfo(char *pathnm, char *argv[]) 
{
    DIR *dirStream; // pointer to a directory stream
    struct dirent *dp; // pointer to a dirent structure
    char *dirContent = NULL; // the contents of the directory
    dirStream = opendir(pathnm); // assign to dirStream the address of pathnm
    if (dirStream == NULL)
    {
        perror(argv[0]);
        exit(EXIT_FAILURE);
    }
    while ((dp = readdir(dirStream)) != NULL) // while readdir() has not reached the end of the directory stream
    {
        struct stat statInfo; // variable to contain information about the path
        asprintf(&dirContent, "%s/%s", pathnm, dp->d_name); // writes the content of the directory to dirContent // asprintf() dynamically allocates memory
        fprintf(stdout, "%s\n", dirContent);
        if (stat(dirContent, &statInfo) != 0) // if getting file or directory information failed
        {
            perror(pathnm);
            exit(EXIT_FAILURE);
        }
        else if (aflag == true) // if the option -a was given
        {
            if (S_ISDIR(statInfo.st_mode)) // if the path is a directory, recursively call getInfo()  
            {
                getInfo(dirContent, &argv[0]);
            }
            else if(S_ISREG(statInfo.st_mode)) // if the path is a file, print all contents
            {
                fprintf(stdout, "%s\n", dirContent);
            }
            else continue;
        }
        free(dirContent);
    }
    closedir(dirStream);
}

1 个答案:

答案 0 :(得分:4)

每个目录都包含一个条目“。”这指向了自己。 您必须确保跳过此条目(以及指向父目录的“..”条目。)

因此,对于您的示例,请在行中添加一个额外条件

if (S_ISDIR(statInfo.st_mode))