📄 file_system.c
字号:
///////////////////////////////// 获取当前目录下 下一个有效文件或者文件夹 /////////////////
void get_next_item(void)
{
item_count++;
get_nst_item();
}
///////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// 进入一个文件夹 /////////////////////////////////////////
void enter_dir(void)
{
unsigned char i;
current_dir.father_dir_cluster_number=current_dir.first_cluster_number;
current_dir.first_cluster_number=temp_dir.first_cluster_number;
current_dir.current_cluster_number=current_dir.first_cluster_number;
not_root_dir++;
for(i=0;i<13;i++)
{
if(item_name[i]==0x2020)break;
dir_name[folder_length/2]=item_name[i];
folder_length+=2;
}
dir_name[folder_length/2]=0x5C20;
folder_length+=2;
item_count=0;
play_count=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// 找出父文件夹起始簇号 ////////////////////////////////////
unsigned long int find_father_dir(void)
{
unsigned long int cluster_number;
unsigned int i,j;
unsigned long int LBA;
current_dir.current_cluster_number=current_dir.first_cluster_number;
do
{
LBA=get_dir_next_sector();
for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
{
read_IDE_sector(LBA);
for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
{
if((buffer[j*32+0]=='.')&&(buffer[j*32+1]=='.')&&(buffer[j*32+11]&0x10)) //找到父目录项
{
((unsigned char *)&(cluster_number))[0]=buffer[j*32+0x15];
((unsigned char *)&(cluster_number))[1]=buffer[j*32+0x14];
((unsigned char *)&(cluster_number))[2]=buffer[j*32+0x1B];
((unsigned char *)&(cluster_number))[3]=buffer[j*32+0x1A];
if(cluster_number==0)
{
cluster_number=dbr[0].root_cluster_num;
}
return cluster_number;
}
}
LBA++;
}
}while((!(current_dir.current_cluster_number>=0xFFFFFFF8))&&(LBA<(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))); //直到文件夹结束
folder_length=4; //如果找不到父目录,则发生严重错误,退回到根目录
for(i=2;i<200;i++)dir_name[i]=0x2020;
not_root_dir=0;
current_dir.first_cluster_number=dbr[0].root_cluster_num;
current_dir.current_cluster_number=current_dir.first_cluster_number;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int not_root_dir; //如果该值不为0,表示不是根目录
///////////////////////////// 退到上一级目录,如果为根目录,则退不动 /////////////////////////
void exit_dir(void)
{
unsigned char i;
if(not_root_dir)
{
not_root_dir--;
current_dir.first_cluster_number=current_dir.father_dir_cluster_number;
current_dir.current_cluster_number=current_dir.first_cluster_number;
if(not_root_dir)current_dir.father_dir_cluster_number=find_father_dir();
folder_length--;
dir_name[folder_length/2]=0x2020;
for(i=0;i<13;i++)
{
folder_length-=2;
if(((unsigned char *)&(dir_name[folder_length/2]))[0]==0x5C)break;
if(((unsigned char *)&(dir_name[folder_length/2]))[1]==0x5C)break;
dir_name[folder_length/2]=0x2020;
}
folder_length++;
}
play_count=0;
item_count=0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// 获取当前文件夹中,第n个有效文件或者文件夹 ////////////////
void get_nst_item(void)
{
unsigned int i,j,k,temp_count;
unsigned long int LBA;
unsigned char xdata temp_buffer[32];
key=0;
temp_count=0;
play_count=0;
current_dir.current_cluster_number=current_dir.first_cluster_number;
do
{
LBA=get_dir_next_sector();
for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
{
read_IDE_sector(LBA);
for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
{
if(j==15){for(k=0;k<32;k++)temp_buffer[k]=buffer[k+512-32];} //如果已到最后一个项,则将之保存
for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];
file.attribute=buffer[j*32+11];
if(is_a_mp3_file())
{
if(black)
{
write_LCD_command(0x34);
write_LCD_command(0x05);
write_LCD_command(0x30);
black=0;
}
temp_count++;
play_count++;
if(temp_count==item_count)
{
for(k=0;k<11;k++)item_name[k]=buffer[j*32+k]; //保存短文件名
if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;} //如果为第一项,则用刚刚保存的一项替换最后一项
j--;
if((buffer[j*32+11]==0x0F)&&(buffer[j*32]!=0xE5)) //如果找到长目录,则用长目录名替换短目录名
{
for(k=0;k<10;k++)
{
((unsigned char *)item_name)[k]=buffer[j*32+0x02+k];
k++;
((unsigned char *)item_name)[k]=buffer[j*32+k];
}
for(k=0;k<12;k++)
{
((unsigned char *)item_name)[10+k]=buffer[j*32+0x0F+k];
k++;
((unsigned char *)item_name)[10+k]=buffer[j*32+0x0D+k];
}
((unsigned char *)item_name)[22]=buffer[j*32+0x1D];
((unsigned char *)item_name)[23]=buffer[j*32+0x1C];
((unsigned char *)item_name)[24]=buffer[j*32+0x1F];
((unsigned char *)item_name)[25]=buffer[j*32+0x1E];
}
for(k=0;k<13;k++){if((item_name[k]==0x0000)||(item_name[k]==0xFF00)||(item_name[k]==0xFFFF))break;change_code(&(item_name[k]));}
for(;k<13;k++)item_name[k]=0x2020;
file_or_folder=IS_MP3FILE;
return;
}
}
if(is_a_folder())
{
if(!black)
{
write_LCD_command(0x34);
write_LCD_command(0x05);
write_LCD_command(0x30);
black=1;
}
temp_count++;
if(temp_count==item_count)
{
((unsigned char *)&(temp_dir.first_cluster_number))[0]=buffer[j*32+0x15];
((unsigned char *)&(temp_dir.first_cluster_number))[1]=buffer[j*32+0x14];
((unsigned char *)&(temp_dir.first_cluster_number))[2]=buffer[j*32+0x1B];
((unsigned char *)&(temp_dir.first_cluster_number))[3]=buffer[j*32+0x1A];
temp_dir.current_cluster_number=temp_dir.first_cluster_number;
for(k=0;k<11;k++)item_name[k]=buffer[j*32+k]; //保存短文件名
if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;}
j--;
if((buffer[j*32+11]==0x0F)&&(buffer[j*32]!=0xE5))
{
for(k=0;k<10;k++)
{
((unsigned char *)item_name)[k]=buffer[j*32+0x02+k];
k++;
((unsigned char *)item_name)[k]=buffer[j*32+k];
}
for(k=0;k<12;k++)
{
((unsigned char *)item_name)[10+k]=buffer[j*32+0x0F+k];
k++;
((unsigned char *)item_name)[10+k]=buffer[j*32+0x0D+k];
}
((unsigned char *)item_name)[22]=buffer[j*32+0x1D];
((unsigned char *)item_name)[23]=buffer[j*32+0x1C];
((unsigned char *)item_name)[24]=buffer[j*32+0x1F];
((unsigned char *)item_name)[25]=buffer[j*32+0x1E];
}
for(k=0;k<13;k++){if((item_name[k]==0x0000)||(item_name[k]==0xFF00)||(item_name[k]==0xFFFF))break;change_code(&(item_name[k]));}
for(;k<13;k++)item_name[k]=0x2020;
file_or_folder=IS_FOLDER;
return;
}
}
}
LBA++;
if(key)
{
if(key==KEY_FUN){key=0;goto exit;}
else key=0;
}
}
}while((!(current_dir.current_cluster_number>=0xFFFFFFF8))&&(LBA<(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))); //直到文件夹结束
exit:
item_count=0;
play_count=0;
file_or_folder=IS_EMPTY;
for(k=0;k<13;k++)item_name[k]=0x2020;
}
////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -