如何递归遍历目录并打印C中的所有文件?

时间:2017-05-18 01:13:55

标签: c unix recursion directory

我试图以递归方式遍历目录并打印出所有文件。

当我尝试使用下面的代码时,例如我用sprint调用函数("。","。")我得到一堆的输出点。

当我减少允许的开放进程数量(ulimit -n 20)时,我得到17个点。我不明白,因为我认为readdir()和opendir()不会创建新进程。这是我的代码:

Option.bind OptionalValue.asOption OptionalValue.Missing

在某些地方,它还没有到达其余的文件,因为它只打印点,而不是完整的文件名。我认为这是我最后一个if循环中的某个地方,但我不确定。

1 个答案:

答案 0 :(得分:0)

这是一个执行该操作的递归代码:

void sprint(char *filename, char * dirToOpen, int level = 0)
{
    DIR *dir;
    struct dirent *entry;
    struct stat s;

    if (!(dir = opendir(dirToOpen)))
        return;
    if (!(entry = readdir(dir)))
        return;

    do
    {
        if(lstat(dirToOpen, &s) == 0 && S_ISDIR(s.st_mode)) /*if it's a directory*/
        {
            char path[1024];
            int len = snprintf(path, sizeof(path)-1, "%s/%s", dirToOpen, entry->d_name); /*makes pathname*/
            path[len] = 0;
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) /*if the directory isn't . or ..*/
                continue;
            printf("%*s[%s]\n", level * 2, "", entry->d_name);
            sprint(filename ,path, level + 1);
        }
        else
        {
            if(strcmp(entry->d_name, filename) == 0 || strcmp(filename, ".") == 0) /*if entry name corresponds to filename, print it*/
             printf("%*s- %s\n", 2, "", entry->d_name);
        }
    } while (entry = readdir(dir)); /*while there are more entries to read*/
    closedir(dir);
}

sprint(".", ".");调用它以递归方式遍历目录并打印出所有文件。

受到this回答的启发。