我在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
)应该被修改。
有没有办法做这样的事情(将打开的目录作为参数传递给函数)?
答案 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;
}