将打开的目录作为参数传递

Passing opened dir as argument

我有 C 中的递归函数:

void dir(char *file_name, char *dir_name) {
    DIR *f=opendir(dir_name);
    if(f==NULL)
        perror(dir_name);
    else {
        struct dirent *a;
        while((a=readdir(f))!=NULL) {
            if(strcmp(a->d_name,".")!=0 && strcmp(a->d_name,"..")!=0 && a->d_type==4) {
                char s1[250];
                strcpy(s1,dir_name);
                if(s1[strlen(s1)-1]!='/')
                        strcat(s1,"/");
                strcat(s1,a->d_name);
                if(strcmp(a->d_name,file_name)==0)
                {
                    printf("%s\n",s1);
                    n++;
                }
                dir(file_name,s1);
            }
            else
            {
                if(strcmp(a->d_name,file_name)==0)
                {
                    n++;
                }
            }
        }
    closedir(f);
    }
}

它实际做了什么:它在 "dir_name" 及其子文件夹中查找 "file_name" 并计算 "file_name" 在该层次结构中出现的次数。

我只是在 main() 中调用它,就像 dir(argv[1],argv[2]); (一些带有参数“./program_name file_to_find.txt directory”的 C 程序)。

实际上一切正常,但我不想打开 void dir() 中的目录。我希望它在 main() 中打开并将其数据作为参数传递给 dir()(因此应该修改参数 char *dir_name)。

有没有办法做这样的事情(将打开的目录作为参数传递给函数)?

真的很简单

void dir(DIR *f, char *file_name, char *dir_name)
{
    struct dirent *a;
    int n = 0;

    while ((a = readdir(f)) != NULL)
    {
        if (strcmp(a->d_name,".") != 0 && strcmp(a->d_name,"..") != 0 && a->d_type == 4)
        {
            char s1[250];
            DIR *next;

            strcpy(s1, dir_name);
            if (s1[strlen(s1) - 1] != '/')
                strcat(s1, "/");
            strcat(s1, a->d_name);

            if (strcmp(a->d_name, file_name) == 0)
            {
                printf("%s\n",s1);
                n++;
            }

            next = opendir(s1);
            if (next != NULL)
            {
                dir(next, file_name, s1);
                closedir(next);
            }
        }
        else
        {
            if (strcmp(a->d_name, file_name) == 0)
            {
                n++;
            }
        }
    }
}

int main(int argc, char **argv)
{
    DIR *f;

    if (argc < 3)
        return -1;

    f = opendir(argv[2]);
    if (f != NULL)
    {
        dir(f, argv[1], argv[2]);
        closedir(f);
    }
    return 0;
}