【问题标题】:Passing opened dir as argument将打开的目录作为参数传递
【发布时间】:2015-01-07 20:12:52
【问题描述】:

我在 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)应该被修改。

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

【问题讨论】:

    标签: c linux posix opendir


    【解决方案1】:

    其实很简单

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

    【讨论】:

    • dir_name 参数呢?看起来你没有通过main()
    • 是的,它有效。谢谢。 n 里面的 dir() 看起来有一些问题,因为它是从函数中抛出的,但暂时不要介意,我已经在全局范围内使用它(它是一个小程序,只是这个 void 和 main )。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 2013-05-07
    • 1970-01-01
    • 2011-04-20
    • 2014-10-25
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多