搜索
bottom↓
回复: 1

阿永的MP3程序中Fat.c的fatGetDirEntry(unsigned int entry)怎么工作的,是不是不读短

[复制链接]

出0入0汤圆

发表于 2007-9-27 22:26:53 | 显示全部楼层 |阅读模式
/*-----------------------------------------------------------------------
查询一个文件的开始簇
-----------------------------------------------------------------------*/
unsigned int baseentry = 0;
unsigned int entrycount = 0;


unsigned long fatGetDirEntry(unsigned int entry)
{
        unsigned long sector;
        struct direntry *de = 0;        // 防止compiler warning
        struct winentry *we;
        unsigned int hasBuffer;
        unsigned int b;
        int i,index;
        char *p;
       
        entrycount = 0;
        DirNameBuffer = 0;
       
       
        // 读取目录区数据
        sector = fatClustToSect(FirstDirSector);

        hasBuffer = 0;

        index = 16;       
        do
        {
                if(index == 16)        // 是否该一人一扇区time for next sector ?
                {
                        ReadBlock(sector++);
                        de = (struct direntry *)BUFFER;
                        index = 0;
                }       
       
                if(*de->deName != 0xE5)
                {
                        // 如果if not a deleted entry
                        if(de->deAttributes == ATTR_LONG_FILENAME)//长文件名
                        {
                                // we have a long name entry
                                we = (struct winentry *) de;
                                b = 13 *( (we->weCnt-1) & 0x0f);                                // index into string
                                p = &LongNameBuffer;
                                for (i=0;i<5;i++)        *p++ = we->wePart1[i*2];        // copy first part                       
                                for (i=0;i<6;i++)        *p++ = we->wePart2[i*2];        // second part
                                for (i=0;i<2;i++)        *p++ = we->wePart3[i*2];        // and third part
                                if (we->weCnt & 0x40) *p = 0;                                        // in case dirnamelength is multiple of 13
                                if ((we->weCnt & 0x0f) == 1) hasBuffer = 1;                // mark that we have a long entry
                        }
                        else
                        {
                                // we have a short name entry
                                // check if this is the end of a multi-part long name entry
                                if(hasBuffer)
                                {
                                        // a long entry name has been collected
                                        // is it a directory ?
                                        if(de->deAttributes == ATTR_DIRECTORY)
                                        {
                                                unsigned long save = FirstDirSector;
                                                unsigned int save2 = baseentry;
                                                unsigned long rval;
                                               
                                                strcpy(DirNameBuffer,LongNameBuffer);
                                                strcat(DirNameBuffer,"/");

//                                                rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();

                                                // call recursively
                                                FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
                                                rval = fatGetDirEntry(entry);
                                                FirstDirSector = save;
                                                baseentry = save2;
                                                if (rval)
                                                        return rval;
                                                else       
                                                {
                                                        // reload original sector
                                                        ReadBlock(sector-1);//ataReadSectors( DRIVE0,        sector-1, 1, SectorBuffer);
                                                        entrycount--;                        // decrement entry counter               
                                                        *DirNameBuffer = 0;
                         }
                                        }
                                        else // normal file entry
                                                if(entrycount == entry)               
                                                        break;
                                        hasBuffer = 0;        // clear buffer       
                                        entrycount++;        // increment entry counter               
                                }
                                // else ignore short_name_only entries
                        }
                }
                de++;
                index++;
        }        while (*de->deName || index == 16);        // 0 in de->deName[0] if no more entries

        if (hasBuffer == 0)                // end of entries
                return 0;
       
        FileSize = de->deFileSize;
        LCD_write_english_string(0,1,LongNameBuffer);
        return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
}

出0入0汤圆

 楼主| 发表于 2007-9-27 22:28:25 | 显示全部楼层
请高手指点,多谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 17:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表