FATFS 檔案管理 (1) - 判斷檔案型別
阿新 • • 發佈:2018-11-05
思路:通過判斷檔案字尾來判斷檔案型別;
(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比較時以此為依據。
據此 檔名解析可以得到正確的值。