中级会员
 
- 积分
- 222
- 金钱
- 222
- 注册时间
- 2012-3-15
- 在线时间
- 13 小时
|
我想把SD卡根目录下的文件夹名和歌曲分别保存在两个二维数组中,这两个函数分别扫描出文件夹名和歌曲名,但是不知道什么原因在扫描完歌曲的时候用来保存文件夹名字的数组里面也被赋值进歌曲的名字,先执行scan_root_folder();,然后执行scan_song();在红色的地方song_name_buf[song_num][j] = finfo.fname[j];这句注释掉文件夹名字的数组就不会有歌曲的值还是原来执行scan_root_folder();的值,但是没有找到文件夹名字数组在scan_song();里有赋值的地方,不胜感激~
/********************************************************
函数名称:void scan_root_folder(void)
功能描述:列举根目录下文件夹
全局变量:folder_name_buf[][13]:根目录文件夹缓存区; folder_total_num:文件夹总数
参数说明:无
返回值: 无
说明: 得到根目录下文件夹总数以及保存文件夹名称到folder_name_buf[][13]
folder_name_buf[1][13]为根目录
*********************************************************/
void scan_root_folder(void)
{
FATFS fs;
FILINFO finfo;
DIR dirs;
FRESULT res; // FatFs function common result code
u8 i, j;
u8 root_name[13] = {"/"};//根目录名称
u8 folder_num = 0;//当前文件夹序号
f_mount(0, &fs);//卸载或挂在一个逻辑驱动器
for(j = 0; j < 14; j++)//存根目录名称到folder_name_buf[1][]
{
folder_name_buf[1][j] = root_name[j];
}
res = f_opendir(&dirs, (TCHAR*)&folder_name_buf[folder_name_num][0]); //打开文件目录
if(res == FR_OK)
{
printf("\r\n\r\n%20s\r\n", "-----------文件夹列表-----------");
printf("\r\n%s", &folder_name_buf[1][0]); //根目录
while((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
{
i = strlen(finfo.fname);
if(finfo.fattrib & AM_DIR)//如果是文件夹
{
folder_num++;
for(j = 0;j < 14;j++)
{
folder_name_buf[folder_num + 1][j] = finfo.fname[j];
}
printf("\r\n%s", &folder_name_buf[folder_num + 1][0]); //其他文件夹
//printf("\r\n%s/%s", path, &finfo.fname[0]);
switch(i)//作用:输出文件名左对齐
{
case 1:printf(" ");
case 2:printf(" ");
case 3:printf(" ");
case 4:printf(" ");
case 5:printf(" ");
case 6:printf(" ");
case 7:printf(" ");
case 8:printf("%15s"," ");
}
}
else
{
}
}
if(folder_num == 0)//无文件夹
{
printf("\r\n%s\r\n","<无文件夹>");
printf("\r\n\r\n%s%s\r\n","文件夹总计:", "0");
}
else
{
printf("\r\n\r\n%s%d\r\n","文件夹总计:", (folder_num + 1));
}
}
f_mount(0, NULL);
folder_total_num = (folder_num + 1); //总文件夹数加上根目录
}
/********************************************************
函数名称:void scan_song(void)
功能描述:列举指定目录下歌曲文件
全局变量:folder_name_buf[][13]:根目录文件夹缓存区;song_name_buf[][13]:歌曲名称缓存区
song_total_num:歌曲总数;folder_name_num:当前文件夹序号
参数说明:无
返回值: 无
说明: 得到当前文件夹下歌曲总数以及保存当前文件夹下歌曲到song_name_buf[][13]
*********************************************************/
void scan_song(void)
{
FATFS fs;
FILINFO finfo;
DIR dirs;
FRESULT res; // FatFs function common result code
u8 i, j, n;
u8 song_num = 0;//当前歌曲序号
f_mount(0, &fs);//卸载或挂在一个逻辑驱动器
for(n = 0; n <= song_total_num; n++)//先清除文件夹缓存区中上一个文件夹下歌曲名称
{
for(j = 0; j < 14; j++)
{
song_name_buf[n][j] = 0;
}
}
res = f_opendir(&dirs, (const TCHAR*)&folder_name_buf[folder_name_num][0]); //打开目录
if (res == FR_OK)
{
printf("\r\n\r\n%20s\r\n", "-----------歌曲列表-----------");
while((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0])
{
i = strlen(finfo.fname);//名字长度
if(finfo.fattrib != AM_DIR)
{
if(((finfo.fname[9] == 'W') && (finfo.fname[10] == 'M') && (finfo.fname[11] == 'A'))
|| ((finfo.fname[9] == 'M') && (finfo.fname[10] == 'P') && (finfo.fname[11] == '3'))
|| ((finfo.fname[9] == 'W') && (finfo.fname[10] == 'A') && (finfo.fname[11] == 'V')))
{
song_num++;
for(j = 0;j < 14;j++)
{
song_name_buf[song_num][j] = finfo.fname[j]; }
printf("\r\n%s/%s", (const TCHAR*)&folder_name_buf[folder_name_num][0], &song_name_buf[song_num][0]);
switch(i)//作用:输出文件名左对齐
{
case 1:printf(" ");
case 2:printf(" ");
case 3:printf(" ");
case 4:printf(" ");
case 5:printf(" ");
case 6:printf(" ");
case 7:printf(" ");
case 8:printf("%15s"," ");
}
}
}
else
{
}
}
if(song_num == 0)//无歌曲文件
{
printf("\r\n%s\r\n","<无歌曲文件>");
printf("\r\n\r\n%s%s\r\n","歌曲文件总计:", "0");
}
else
{
printf("\r\n\r\n%s%d\r\n","歌曲文件总计:", song_num);
}
}
f_mount(0, NULL);
song_total_num = song_num;
} |
|
|