思路:通过判断文件后缀来判断文件类型;
(1) 先建立基准数据
TODO: update the count
#define FILE_MAX_MAIN_TYPE 7
#define FILE_MAX_SUB_TYPE 4
static const char *File_Table[FILE_MAX_MAIN_TYPE][FILE_MAX_SUB_TYPE] =
{
{"BIN"},
{"LRC"},
{"NES"},
{"TXT","C","H"},
{"WAV","MP3","APE","FLAC"},
{"BMP","JPG","JPEG","GIF"},
{"AVI"},
};
(2)文件类型定义
8位类型 高四位表示大类, 低四位表示小类
static U8 GetFileType(const char *exp)
{
U8 i = 0, j = 0;
U8 result = 0xFF; /* unknow type */
const char *dest = exp;
for(i = 0; i < FILE_MAX_MAIN_TYPE; i++)
{
for(j = 0 ; j < FILE_MAX_SUB_TYPE; j++)
{
if(*File_Table[i][j] == 0) break;
if(strcmp(File_Table[i][j], dest) == 0)
{
/* found */
result = (i << 4 | j);
}
}
}
return result;
}
如果返回0xFF, 表示未知类型
以上对文件类型进行了定义(参考正点原子),下面难点是怎么解析文件后缀;这里采用不同的方法。
(3) 根据文件名获取后缀
static void GetPostfix(const char *filename, char *postfix)
{
const char *seps = " \t"; // 文件名中夹杂空格的先隔离出来
char *args[FILE_MAX_TOKEN] = {NULL};
char *token = NULL;
char *post = NULL;
char destline[32];
const char *src = filename;
char *dest = destline;
while(*src != '\0')
{
*dest++ = *src++;
}
*dest = '\0';
dest = destline; /* point to the first char */
U8 len = 0;
token = strtok(dest, seps);
while(NULL != token)
{
if(len > FILE_MAX_TOKEN - 1) break;
args[len++] = token ; /* save all token */
token = strtok(NULL, seps); /* get next */
}
const char *sep = "."; // 最后隔离点 如 a.mp3
post = args[len - 1]; /* fetch the last one */
token = strtok(post, sep);
if(token != NULL)
{
token = strtok(NULL, sep); /* discard the first exp */
Convent2Upper(token , postfix);
}
}
获取到了postfix,然后转化为大写的
(4)小写转化成大写
static void Convent2Upper(const char *exp, char *result)
{
const char *src = exp;
U8 i = 0;
U8 len = strlen(src);
for(i = 0; i < len; i++)
{
*result++ = ToUpper(*src++);
}
*result = '\0'; //TODO: Attention !
}
其中最后 *result = '\0' 这句必不可少,这是字符串结束符,前面strcmp比较时以此为依据。
据此 文件名解析可以得到正确的值。