📄 fat.c
字号:
}
}
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 + -