传递打开的dir作为参数

时间:2015-01-07 20:12:53

标签: c linux posix opendir

我在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);
    }
}

它实际上做了什么:它寻找" file_name"在里面" dir_name"和它的子文件夹,并计算" file_name"出现在该层次结构上。

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

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

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

1 个答案:

答案 0 :(得分:0)

这很简单

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;
}