1. 程式人生 > >FATFS 檔案管理 (1) - 判斷檔案型別

FATFS 檔案管理 (1) - 判斷檔案型別

思路:通過判斷檔案字尾來判斷檔案型別;

(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比較時以此為依據。

據此 檔名解析可以得到正確的值。