繁体   English   中英

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

[英]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”在该层次结构上出现的可能时间。

我就像在dir(argv[1],argv[2]);一样在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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM