学习日志3—用目录IO模拟find功能
步骤:
1.打开目录
2.读取目录流指针
3.判断是不是为到结尾或者是不是为空
4.跳过当前目录.和下一级目录…
5.将文件路径和文件名拼接起来
6.判断是不是目录,是则进行递归调用
7.判断是不是文件,是则判断是不是所要找的文件,是则将该路径打印出来
代码示例
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <error.h>
#include <stdlib.h>
int Find_file(char *pathdir,char *pathfile);
int main(int argc,char **argv)
{
if(argc != 3)
{
printf("输入有误,请重新运行再输入!\n");
return -1;
}
Find_file(argv[1],argv[2]);
return 0;
}
int Find_file(char *pathdir,char *pathfile)
{
//打开目录
DIR * dp = opendir(pathdir);
if(dp == NULL)
{
perror("opendir");
return -1;
}
//定义一个结构体目录来接收目录流指针
struct dirent *eq=NULL;
//申请一个空间来存放数据
char *space = (char *)calloc(1,257);
while(1)
{
//读取目录流指针
eq = readdir(dp);
//判断是不是读完了
if(eq == NULL) break;
//把当前目录和上一级目录忽略掉
if((!strcmp(eq->d_name,".")) || (!strcmp(eq->d_name,".."))) continue;
//判断输入目标路径的是否最后有/,有就不用加上,没有就加上
if(pathdir[strlen(pathdir)-1]=='/')
{
sprintf(space,"%s%s",pathdir,eq->d_name);
}
else
{
sprintf(space,"%s/%s",pathdir,eq->d_name);
}
//判断是不是读到目录,是则进行递归调用
if(eq->d_type == 4)
{
Find_file(space,pathfile);
}
//判断是不是普通文件,是则判断文件名是不是自己要的文件,是则打印出文件所在的路径
if(eq->d_type == 8)
{
if(!strcmp(eq->d_name,pathfile))
{
printf("%s\n",space);
}
}
}
//释放空间,关闭文件
free(space);
closedir(dp);
}
运行结果:
zby@DESKTOP-I6LIOTH:/mnt/g/嵌入式开发/文件IO/6$ ./my_find …/…/ 可以,很棒
…/…/文件IO/6/5/可以,很棒
zby@DESKTOP-I6LIOTH:/mnt/g/嵌入式开发/文件IO/6$ ./my_find …/… 可以,很棒
…/…/文件IO/6/5/可以,很棒