13.3.1 添加目录到媒体库
添加目录到媒体库需要利用遍历目录中所有文件的方法,并且需要判断该文件是否为媒体文件。实现该功能以前,首先要设计一个函数检查某个表示文件路径的字符串是否为媒体文件。以MP3文件为例,所有MP3文件的后缀名都是mp3或者MP3,这可以作为判断该文件是否为MP3文件的依据。如下列源代码所示:
int is_mp3(const char *name)
{
int l;
if (!name) { // 判断指针是否执行NULL
printf("文件名指针错误/n");
return 0;
}
l = strlen(name); // 获得文件名的长度
if (l < 5) { // 判断文件名字符串是否有意义
printf("输入的文件名有误/n ");
return 0;
}
l -= 4; // 计算距离后缀名的偏移量
if (strcmp(name + l, ".mp3") && strcmp(name + l, ".MP3")) {
// 判断后缀名是否为媒体文件名
return 0;
}
return 1;
}
将上述函数添加到medialib.c文件中,然后为该文件添加下列头文件,以便于处理文件和目录操作。
#include <fcntl.h> // 提供open()函数
#include <unistd.h> // 提供close()函数
#include <dirent.h> // 提供目录流操作函数
#include <sys/stat.h> // 提供属性操作函数
#include <sys/types.h> // 提供mode_t类型
实现添加目录到媒体库的函数名称为link_add_dir(),该函数也可用来操作播放列表,有关添加目录到播放列表的实现将在后面介绍。link_add_dir()函数的源代码如下:
int link_add_dir(link_t *mlink, const char *dir)
{
DIR *dp; // 定义子目录流指针
struct dirent *entry; // 定义dirent结构指针保存后续目录
struct stat statbuf; // 定义statbuf结构保存文件属性
if((dp = opendir(dir)) == NULL) { // 打开目录,获得子目录流指针,判断
// 操作是否成功
printf("无法打开该目录");
return 0;
}
chdir(dir); // 切换到当前目录中去
while((entry = readdir(dp)) != NULL) { // 获取下一级目录信息,如果未结束则
// 循环
lstat(entry->d_name, &statbuf); // 获取下一级成员属性
if(S_IFDIR & statbuf.st_mode) { // 判断下一级成员是否是目录
if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) ==
0)
continue; // 如果获得的成员是符号“.”和“..”,
跳过本次循环
link_add_dir(mlink, entry->d_name);// 递归调用自身,扫描下一级目录的
// 内容
}
else {
if(is_mp3(entry->d_name)) // 判断当前文件是否为媒体文件
link_add(mlink, entry->d_name); // 添加该文件到媒体库链表
}
}
chdir(".."); // 回到上一级目录
closedir(dp); // 关闭子目录流
return 1;
}
代码中调用了is_mp3()函数判断遍历到的文件是否为媒体文件,如果是媒体文件,则用link_add()函数将该文件添加到媒体库链表。