FATFS 文件管理 (1) - 判断文件类型

博客介绍了通过判断文件后缀来判断文件类型的思路。先建立基准数据,对文件类型进行定义,8位类型中高四位表示大类、低四位表示小类,返回0xFF为未知类型。还阐述了解析文件后缀的方法,包括根据文件名获取后缀并转化为大写,强调字符串结束符的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:通过判断文件后缀来判断文件类型;

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值