⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
📖 第 1 页 / 共 5 页
字号:
                                }
                            }
                            m_c[line].LongName[i] = '\0';
                            for(i=0; i<11; i++)
                            {
                                //m_c[line].ShortName[i] = de->deName[i];
                                m_c[line].ShortName[i] = deBuf.deName[i];
                            }
                            m_c[line].ShortName[i] = '\0';
                            m_c[line].Type = 0;
                            //m_c[line].Clust = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
                            m_c[line].Clust = ((INT32U)deBuf.deHighClust << 16) + deBuf.deStartCluster;
                            m_c[line++].FileLen = 0;
                        }
                    }
                }
                else
                {
                    //if((de->deAttributes&ATTR_DIRECTORY) == ATTR_DIRECTORY)
                    if((deBuf.deAttributes&ATTR_DIRECTORY) == ATTR_DIRECTORY)
                    {
                        //if(!IsCurDir(de->deName))
                        if(!IsCurDir(deBuf.deName))
                        {
                            fileNo++;
                            if((fileNo>=index)&&(line<4))
                            {
                                for(i=0;i<11;i++)
                                {
					      	        //m_c[line].ShortName[i]=de->deName[i];
					      	        //m_c[line].LongName[i]=de->deName[i];
					      	        m_c[line].ShortName[i]=deBuf.deName[i];
					      	        m_c[line].LongName[i]=deBuf.deName[i];					      	        
					            }
                                m_c[line].ShortName[i]='\0';
                                m_c[line].LongName[i]='\0';
                                m_c[line].Type=0;
                                //m_c[line].Clust=((unsigned long)de->deHighClust << 16) + de->deStartCluster;
                                m_c[line].Clust=((unsigned long)deBuf.deHighClust << 16) + deBuf.deStartCluster;
                                m_c[line++].FileLen=0;
                            }
                        }
                    }
                }
            }   
        }
        //de++;
        fp.Index++; 
        //if(de->deName[0] == 0) // 文件的最后一项 
        if(deBuf.deName[0] == 0) // 文件的最后一项 
        {    
            break;
        }  
    }while(1);  
    
//------------------------- 再查找音乐文件 -----------------------------------------
    InitSetPath(&fp,dircluster);
    ReadBlock(fp.Sector);           // 读取目录表
    do 
    {  
        if(!ReadNextDirEntry(&fp))  // 目录为空
        {    
            break;
        }
        //de = (DIRENTRY *)BUFFER;
        //de+=fp.Index;
        deBuf.deName[0] =  BUFFER[0 + count * fp.Index];
        deBuf.deName[1] =  BUFFER[1 + count * fp.Index];
        deBuf.deName[2] =  BUFFER[2 + count * fp.Index];         
        deBuf.deName[3] =  BUFFER[3 + count * fp.Index];   
        deBuf.deName[4] =  BUFFER[4 + count * fp.Index];
        deBuf.deName[5] =  BUFFER[5 + count * fp.Index];
        deBuf.deName[6] =  BUFFER[6 + count * fp.Index];         
        deBuf.deName[7] =  BUFFER[7 + count * fp.Index];               
        deBuf.deExtension[0] = BUFFER[8 + count * fp.Index];
        deBuf.deExtension[1] = BUFFER[9 + count * fp.Index];        
        deBuf.deExtension[2] = BUFFER[10 + count * fp.Index];
        deBuf.deAttributes = BUFFER[11 + count * fp.Index]; 
        deBuf.deLowerCase = BUFFER[12 + count * fp.Index]; 
        deBuf.deCHundredth = BUFFER[13 + count * fp.Index];
        deBuf.deCTime[0] = BUFFER[14 + count * fp.Index];
        deBuf.deCTime[1] = BUFFER[15 + count * fp.Index]; 
        deBuf.deCDate[0] = BUFFER[16 + count * fp.Index];
        deBuf.deCDate[1] = BUFFER[17 + count * fp.Index];        
        deBuf.deADate[0] = BUFFER[18 + count * fp.Index];
        deBuf.deADate[1] = BUFFER[19 + count * fp.Index];
        deBuf.deHighClust = BUFFER[20 + count * fp.Index] | (BUFFER[21 + count * fp.Index] << 8);    
        deBuf.deMTime[0] = BUFFER[22 + count * fp.Index]; 
        deBuf.deMTime[1] = BUFFER[23 + count * fp.Index];
        deBuf.deMDate[0] = BUFFER[24 + count * fp.Index];
        deBuf.deMDate[1] = BUFFER[25 + count * fp.Index]; 
        deBuf.deStartCluster = BUFFER[26 + count * fp.Index] | (BUFFER[27 + count * fp.Index] << 8);  
        deBuf.deFileSize = BUFFER[28 + count * fp.Index] | (BUFFER[29 + count * fp.Index] << 8) | (BUFFER[30 + count * fp.Index] << 16) | (BUFFER[31 + count * fp.Index] << 24);  
        
        //if(*de->deName != 0xe5)     // 找到目录或文件
        if(deBuf.deName[0] != 0xe5)     // 找到目录或文件
        {       
            //if((de->deAttributes&ATTR_LONG_FILENAME) == ATTR_LONG_FILENAME)
            if((deBuf.deAttributes&ATTR_LONG_FILENAME) == ATTR_LONG_FILENAME)
            {
                //we = (WINENTRY *) &deBuf;
                weBuf.weCnt =  BUFFER[0 + count * fp.Index];
                weBuf.wePart1[0] =  BUFFER[1 + count * fp.Index];
                weBuf.wePart1[1] =  BUFFER[2 + count * fp.Index];
                weBuf.wePart1[2] =  BUFFER[3 + count * fp.Index];         
                weBuf.wePart1[3] =  BUFFER[4 + count * fp.Index];   
                weBuf.wePart1[4] =  BUFFER[5 + count * fp.Index];
                weBuf.wePart1[5] =  BUFFER[6 + count * fp.Index];
                weBuf.wePart1[6] =  BUFFER[7 + count * fp.Index];         
                weBuf.wePart1[7] =  BUFFER[8 + count * fp.Index];
                weBuf.wePart1[8] =  BUFFER[9 + count * fp.Index];
                weBuf.wePart1[9] =  BUFFER[10 + count * fp.Index];
                weBuf.weAttributes =  BUFFER[11 + count * fp.Index];  
                weBuf.weReserved1 =  BUFFER[12 + count * fp.Index]; 
                weBuf.weChksum =  BUFFER[13 + count * fp.Index];
                weBuf.wePart2[0] =  BUFFER[14 + count * fp.Index];
                weBuf.wePart2[1] =  BUFFER[15 + count * fp.Index];
                weBuf.wePart2[2] =  BUFFER[16 + count * fp.Index];         
                weBuf.wePart2[3] =  BUFFER[17 + count * fp.Index];   
                weBuf.wePart2[4] =  BUFFER[18 + count * fp.Index];
                weBuf.wePart2[5] =  BUFFER[19 + count * fp.Index];
                weBuf.wePart2[6] =  BUFFER[20 + count * fp.Index];         
                weBuf.wePart2[7] =  BUFFER[21 + count * fp.Index];
                weBuf.wePart2[8] =  BUFFER[22 + count * fp.Index];
                weBuf.wePart2[9] =  BUFFER[23 + count * fp.Index];       
                weBuf.wePart2[10] =  BUFFER[24 + count * fp.Index];
                weBuf.wePart2[11] =  BUFFER[25 + count * fp.Index];                
                weBuf.weReserved2 = BUFFER[26 + count * fp.Index] | (BUFFER[27 + count * fp.Index] << 8);
                weBuf.wePart3[0] =  BUFFER[28 + count * fp.Index];
                weBuf.wePart3[1] =  BUFFER[29 + count * fp.Index];
                weBuf.wePart3[2] =  BUFFER[30 + count * fp.Index];         
                weBuf.wePart3[3] =  BUFFER[31 + count * fp.Index];
                
                //b = 13 *( (we->weCnt-1) & 0x0f);        // index into string
                b = 13 *( (weBuf.weCnt-1) & 0x0f);        // index into string
                //if(b<50-13){
                p = &LongNameBuffer[b];
                for (i=0; i<10; i++)	                // copy first part
                {
                    //*p++ = we->wePart1[i];
                    *p++ = weBuf.wePart1[i];	
                }			
                for (i=0; i<12; i++)	                // second part
                {
                    //*p++ = we->wePart2[i];	
                    *p++ = weBuf.wePart2[i];
                }
                for (i=0; i<4; i++)	                    // and third part
                {
                    //*p++ = we->wePart3[i];
                    *p++ = weBuf.wePart3[i];	
                }
                //if (we->weCnt & 0x40)                   // in case dirnamelength is multiple of 13
                if (weBuf.weCnt & 0x40)                   // in case dirnamelength is multiple of 13
                
                {
                    *p = 0;					
                }
                //}
                //if ((we->weCnt & 0x0f) == 1)            // mark that we have a long entry
                if ((weBuf.weCnt & 0x0f) == 1)            // mark that we have a long entry
                {    
                    hasBuffer = 1;		
                }
            }
            else
            {
                if(hasBuffer)
                {   
                    hasBuffer = 0;	
                    //if((de->deAttributes & ATTR_DIRECTORY) != ATTR_DIRECTORY) // is it a directory ?
                    if((deBuf.deAttributes & ATTR_DIRECTORY) != ATTR_DIRECTORY) // is it a directory ?
                    {     
                        //if(IsMusicFile(&de->deExtension[0]) != 0)
                        if(IsMusicFile(&deBuf.deExtension[0]) != 0)
                        {
                            fileNo++;
                            if((fileNo >= index) && (line < 4))
                            {  
                                if(WorkFlag & bUnicode)
                                {
                                    UniToGB(LongNameBuffer);  //转成GB码
                                    for(i=0; i<40; i++)
                                    {
                                        m_c[line].LongName[i] = LongNameBuffer[i]; 
					                } 
                                }
                                else
                                {
                                    for(i=0; i<11; i++)
                                        //m_c[line].LongName[i] = de->deName[i];
                                        m_c[line].LongName[i] = deBuf.deName[i];
                                }
                                m_c[line].LongName[i] = '\0';
                                for(i=0; i<11; i++)
                                {
                                    //m_c[line].ShortName[i] = de->deName[i];
                                    m_c[line].ShortName[i] = deBuf.deName[i];
                                }
                                m_c[line].ShortName[i] = '\0';
                                m_c[line].Type = 2;
                                //m_c[line].Clust = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
                                m_c[line].Clust = ((INT32U)deBuf.deHighClust << 16) + deBuf.deStartCluster;
                                //m_c[line++].FileLen = de->deFileSize;
                                m_c[line++].FileLen = deBuf.deFileSize;
                            }	 
                        }
                    }
                }
                else
                {
                    //if((de->deAttributes & ATTR_DIRECTORY) != ATTR_DIRECTORY)
                    if((deBuf.deAttributes & ATTR_DIRECTORY) != ATTR_DIRECTORY)
                    {
                        //if(IsMusicFile(&de->deExtension[0])!= 0)
                        if(IsMusicFile(&deBuf.deExtension[0])!= 0)
                        {
                            fileNo++;
                            if((fileNo >= index) && (line < 4))
                            {  
                                for(i=0; i<11; i++)
                                {
                                    //m_c[line].ShortName[i] = de->deName[i];
                                    m_c[line].ShortName[i] = deBuf.deName[i];
                                }
                                m_c[line].ShortName[i] = '\0';
                                for(i=0; i<11; i++)
                                {
                                    //m_c[line].LongName[i] = de->deName[i];
                                    m_c[line].LongName[i] = deBuf.deName[i];
                                }
                                m_c[line].LongName[i] = '\0';
                                m_c[line].Type = 2;
                                //m_c[line].Clust = ((unsigned long)(de->deHighClust) << 16) + ((unsigned long)de->deStartCluster & 0x0000ffff);
                                m_c[line].Clust = ((INT32U)(deBuf.deHighClust) << 16) + ((INT32U)deBuf.deStartCluster & 0x0000ffff);
                                //m_c[line++].FileLen = de->deFileSize;
                                m_c[line++].FileLen = deBuf.deFileSize;
                            }	 
                        }  
                    }
                } 
            }
        }
        //de++;
        fp.Index++; 
        //if(de->deName[0] == 0)  // 文件的最后一项
        if(deBuf.deName[0] == 0)  // 文件的最后一项
        {
            break;  
        }
    }while(1);  
    
    for(i=line; i<4; i++)
    {
        m_c[i].LongName[0] = '\0';
        m_c[i].ShortName[0] = '\0';
        m_c[i].Type = 0xff;
    }
//-------------------------------------------------------------------------	

    return fileNo;
    
    
}


/*****************************************************************************************
* 名称:ReadNextDirEntry
* 功能:取下一个目录项
* 输入:FIND_FILE_INFO *fp
* 返回:1: 查找成功
*       0: 没有目录
*****************************************************************************************/
INT8U ReadNextDirEntry(FIND_FILE_INFO *fp)  
{
    if(fp->Index == 16)	
    {   
        if(!(fp->Nums & 0x8000))
        {		
            if((fp->Nums & 0x7FFF) == 0) 	
            {    
                return 0;
            }
            fp->Nums--;			
        }
        else
        {
            if(fp->NumSector >= SectorsPerCluster)
            {
                fp->Clust = fatNextCluster(fp->Clust);      // 取下一个目录簇
                if(fp->Clust == CLUST_EOFE)                 // 目录内容全部找完
                {
                    return 0;  
                }
                fp->Sector = fatClustToSect(fp->Clust);
                fp->NumSector = 0;
            }
            fp->NumSector++;
        }
        fp->Sector++;
        ReadBlock(fp->Sector);                              // 读取下一个扇

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -