这里用到的一些知识点:
1.主函数传参
int main(int argc,char* argv[])
argc:传参的个数 包含自身
argv:传的参数
argv[0]:可执行程序本身
argv[1]:真正的第一个参数
代码如下:
int main(int argc,char *argv[])
{
if(argc==1)
find_mp3("."); //如果在终端只输入一个参数,默认为当前目录
else
find_mp3(argv[1]);//第二个参数为要查找的目录,如: ../hw
return 0;
}
2.相关目录操作函数介绍
opendir():打开目录
函数的头文件:
#include <sys/types.h>
#include <dirent.h>
函数的原型: DIR *opendir(const char *name);
函数的参数:const char *name:要打开的目录的名字
函数的返回值:成功返回目录流的指针 (DIR *)失败,返回 NULL.
closedir():关闭目录
函数的头文件:
#include <sys/types.h>
#include <dirent.h>
函数的原型:int closedir(DIR *dirp);
函数的参数:DIR *dirp:目录流指针
函数的返回值:成功返回 0 失败返回 -1
readdir():读取目录里的信息
函数的头文件:#include <dirent.h>
函数的原型:struct dirent *readdir(DIR *dirp);
函数的参数:DIR *dirp:目录流指针
函数的返回值:
成功返回读取到文件的信息的结构体的指针
失败返回 NULL
存储目录中的文件信息(文件名、扩展名等等)
struct dirent
{
long d_ino; /* 索引节点号 */
off_t d_off; /*在目录文件中偏移到目录头的偏移量*/
unsigned short d_reclen; /* 文件名长 */
unsigned char d_type; /* 文件类型 */
char d_name [NAME_MAX+1]; /*文件名,最长255字符 */
};
完整代码如下所示:
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
int find_mp3(char *pathname);
struct dirent *mydir =NULL;
int main(int argc,char *argv[])
{
if(argc==1)
find_mp3(".");
else
find_mp3(argv[1]);
return 0;
}
int find_mp3(char *pathname)
{
DIR *dir = NULL;
dir = opendir(pathname);
if(dir == NULL)
{
perror("opendir");
return 0;
}
//mydir = readdir(dir);
while((mydir = readdir(dir)) != NULL)
{
if(!strcmp(mydir->d_name,".") || !strcmp(mydir->d_name,".."))
{
continue; //逃过隐藏的 .和 ..目录
}
for(int i = 0;i < strlen(mydir->d_name);i++)
{
if(mydir->d_name[i] == '.' && mydir->d_name[i+1] == 'm' && mydir->d_name[i+2] == 'p' && mydir->d_name[i+3] == '3')
{
printf("%s\n",mydir->d_name);
break;
}
}
}
closedir(dir);
}
我把.mp3文件存在一个hw1文件夹下面,里面还有其它文件,截图如下:
在终端输入命令:gcc mp3.c -o mp3
./mp3 ./hw1
运行结果如下图所示: