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比较时以此为依据。

据此 文件名解析可以得到正确的值。

你可能感兴趣的:(STM32,FATFS)