⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmp_file_list.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	err = fsDelete( (UINT8 *) NameAddr);		
	if ( err ) {
		ERROR_REPORT;
		return APP_DRV_ERR;
	}

	// 清空该文件在内存中偏移值
	clear_one_file( index );

	// 文件总数减少一个	
	gFileTotal --;

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*		输入一个索引值,获得文件的信息的指针
  input:
			index	[in]	UINT16	索引值 (0x00 -- (总数减一) )
			pInfo   [out]	struct F_Information * *
  output:
			0 成功,非0值失败
  func:
			输入一个索引值,获得该文件的信息
  note:
			注意输入的索引值,不能 >= 文件的总数	

			属性的输出:
				SPMP_FATTR_RDONLY
				SPMP_FATTR_ACCESS
  example:	
			UINT16 index,err;
			struct SPMP_FInfo tmpInfo;

			index = ListBox 中获得光标行的位置;
			err = SPMP_GetOneFileInfo(index, &tmpInfo);
			if( err ){
				WARNING_OUTPUT(("GetOneFileInfo!\r\n"));
				ERROR_STOP;
			}			

			// 将信息显示到UI
																		*/
/************************************************************************/

UINT16 SPMP_GetOneFileInfo(UINT16 index,				// 索引值						 
							   struct F_Information **pInfo	// 存放信息指针的指针
							   )
{
	//	DEBUG_OUTPUT(("index %x Total %x pInfo %x\r\n", index, gFileTotal, pInfo));
	// 判断输入参数是否合法
	if ( (index >= gFileTotal) || (NULL == pInfo) ) {
		ERROR_REPORT;
		return APP_DRV_ERR;
	}

	// 获得信息指针
	caculate_addr(index, NULL, (UINT32 *)pInfo);

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*	输入一个索引值,设定文件的存取属性
  input:
			index	[in]	索引值 (0x00 -- (总数减一) )
			attr	[in]	
							SPMP_FATTR_RDONLY
							SPMP_FATTR_ACCESS
  output:
			0 成功,
			非0值失败
  func:
			输入一个索引值,设定文件的存取属性
  note:
			注意输入的索引值,不能 >= 文件的总数	
  example:	
			UINT16 index,err;
			index = ListBox 中获得光标行的位置;

			// 将光标行所在的文件,进行“加锁”的设置
			err = SPMP_SetOneFileAttr(index, SPMP_FATTR_RDONLY);

			if( err ){
				WARNING_OUTPUT(("Set File Attr Err!\r\n"));
				ERROR_STOP;
			}			
																		*/
/************************************************************************/
UINT16 SPMP_SetOneFileAttr(UINT16 index, UINT16 attr)
{
	UINT8	fs_attr;
	UINT32	FileName, InfoAdd;
	UINT16	err;	 		
	struct	F_Information *pInfo;

	// 判断输入参数是否合法
	if ( (index >= gFileTotal) ) {
		ERROR_REPORT;
		return APP_DRV_ERR;
	}

	// 根据索引值,获得文件名指针, 信息地址指针
	caculate_addr(index, &FileName, &InfoAdd );

	pInfo = (struct	F_Information * )InfoAdd;

	// 获得文件的属性值
	fs_attr = (UINT8) pInfo->attr;

	if ( attr == SPMP_FATTR_RDONLY ) {
		fs_attr |= FAT_READ_ONLY;			
	}
	else{
		fs_attr &= ~FAT_READ_ONLY;
		fs_attr |= FAT_ARCHIVE;
	}

	// 修改文件的属性
	err = fsAttrSet((UINT8 *)FileName, fs_attr);
	if ( err ) {
		ERROR_REPORT;
		return APP_DRV_ERR;
	}

	// 将处理后的值保存到内存中	
	pInfo->attr = ( UINT32 ) fs_attr;

	// 返回成功
	return APP_DRV_OK;
}

/************************************************************************/
/*	退出时,释放占用的资源
  input:
			void	
  output:
			0 成功,
			非0值失败
  func:
			退出程序时,进行资源的释放动作
  note:
			不要忘记调用该函数
  example:	
			// 在退出程序时,进行资源的释放
			UINT16 index;

			err = SPMP_FileListExit();			
																		*/
/************************************************************************/
UINT16 SPMP_FileListExit( void )
{
	UINT8  i;
	UINT16 ret;

	// 恢复为原来的目录
	if (NULL != gpCWDBack) 
	{
		ret = fsDirSet( gpCWDBack, 0);
		if ( ret ) {
			ret = fsDirSet("D:\\", 0);
		}			

		MEM_FREE( gpCWDBack );
		gpCWDBack = NULL;
	}

	// 释放 字符串偏移占用的内存
	if ( NULL != gpStrOffet ) 
	{
		MEM_FREE( gpStrOffet );
		gpStrOffet = NULL;
	}

	// 释放 字符串内容和信息占用的内存
	if ( NULL != gpStrContent ) 
	{
		MEM_FREE( gpStrContent );
		gpStrContent = NULL;
	}

	// 复位全局变量
	gFileTotal = 0x00;
	gFilterAttr = 0xffff;
	
	memset(gFilterStr, '\0', sizeof(gFilterStr));

	return APP_DRV_OK;
}

/************************************************************************/
/* 
	------------------- STATIC FUNCTION  ----------------------
                                                                        */
/************************************************************************/

/*
 *	返回目标路径名的指针	
 */

static UINT8 * get_target_dir( void )
{
	return gpTargetDir;		// 返回目标字符串的指针
}


/************************************************************************/
/* 输入一个索引值, 清空该索引值在内存中的偏移量

  input:
			index	[in]	UINT16 文件的索引值
  output:
			0 成功, 非0值失败
  func:
                                                                        */
/************************************************************************/
static UINT16 clear_one_file( UINT16 index )
{
	UINT16 i;

	// logical 2 physical 
	i = logical_2_physical( index );

	// reset physical offset
	gpStrOffet[i] = DUMMY_OFFSET; 

	return APP_DRV_OK;
}


/************************************************************************/
/*	将输入的逻辑索引值,转换维物理索引值

  input:
			index	[in]	逻辑索引值
  output:
			UINT16  物理索引值
  func:
  note:
                                                                        */
/************************************************************************/
static UINT16 logical_2_physical( UINT16 index )
{
	UINT16 i,j;
	UINT16 *pOffset;
	
	pOffset = gpStrOffet;	

	// 在偏移量数组中进行寻找,直到找到为止
	for(j=0x00,i=0x00; i<DIR_CONTENT_MAX; i++ )
	{
		if ( pOffset[i] == DUMMY_OFFSET ) {		// 跳过无效值
			continue;
		}

		if ( j == index) {		// 判断是否达到输入的索引值
			break;
		}
		else{
			j++;
		}		
	}

	return i;		// 返回物理索引值
}

/************************************************************************/
/*	输入一个索引值, 返回该索引对应的物理索引值
  input:
			pNameAddr	[out]	UINT32 * 
			pInfoAddr	[out]	UINT32 *
  output:
			0成功, 非0值失败
  func:
  note:
		本程序与数据的存储方式直接相关
                                                                        */
/************************************************************************/
static UINT16  caculate_addr(UINT16 index,			// [in] 索引值 
							 UINT32 *pNameAddr,		// [out] 文件名的地址 
							 UINT32 *pInfoAddr)		// [out] 信息的地址
{
	UINT16 i;

	// 进行逻辑索引到物理索引的转换
	i = logical_2_physical( index );

	// 计算文件名存放的地址值
	if (NULL != pNameAddr ) {
		*pNameAddr = (UINT32)gpStrContent + gpStrOffet[i];			
	}

	// 计算信息存放的地址值
	if(NULL != pInfoAddr ) {
		*pInfoAddr = (UINT32)gpStrContent + DIR_CONTENT_MAX/2 + i*sizeof(struct F_Information);		
	}	

	return APP_DRV_OK;	// 返回成功
}
/************************************************************************/
/*	复制文件名信息
  input:
		pbuf	[in]	UINT8 *			存放信息的大致指针
		pInfo	[in]	File_Info_t		文件信息结构体的指针
  output:
		0 成功, 非0值失败
  func:
		将文件信息复制到输入的缓冲区中
                                                                        */
/************************************************************************/

static UINT16 copy_file_info(UINT8 * pbuf, File_Info_t *pInfo )
{
	struct F_Information *ptemp;

	ptemp = (struct F_Information * )pbuf;

	ptemp->attr		= pInfo->attr;
	ptemp->fileSize = pInfo->fileSize;
	
	memcpy(&(ptemp->DateTime), &(pInfo->tCreate), sizeof(Time_Attr_t));

	return APP_DRV_OK;
}
/************************************************************************/
/*	输入一个文件信息的指针, 判断该文件是否合法

  input:
			pFileInfo	[in]	File_Info_t *
  output:
			0 该文件合法, 非0值该文件非法
  func:
			根据输入的信息,和用户设定的滤波器的属性,进行判断
  note:
                                                                        */
/************************************************************************/
static UINT16 judge_file_name( File_Info_t *pFinfo )
{
	UINT16	i, found_flag; 	
	UINT8	*pname;
	UINT8	*ptemp;
	UINT8	buffer[0x10];

	pname = pFinfo->s8_3_FileName;	// short file name

	if ( pFinfo->longLen ) {
		pname = pFinfo->sLongFileName;	// long file name 
	}

	if( pname[0] == '.' ){
		return APP_DRV_ERR;				// 如果首字符是'.', 返回非0值
	}



	//	如果是目录的话, 直接返回失败
	if ( pFinfo->attr & FAT_DIRECTORY ) {
		return APP_DRV_ERR;
	}

	// 如果没有设定属性,或者为全通模式	
	if( (gFilterAttr == 0xffff) || (gFilterAttr == SPMP_NO_FILTER)) {
		return APP_DRV_OK;
	}

	memset(buffer, 0x00, sizeof(buffer));

	found_flag = 0x00;

	// 进行后缀名的寻找动作
#if 0
	ptemp = strchr(pname, '.');		// 在字符串中寻找'.'出现的位置
#else
	ptemp = strrchr(pname,'.');		// 在字符串中寻找'.' 出现的最后一个位置
#endif

	// 如果找到'.'的话,进行
	if (NULL != ptemp) 
	{
		buffer[0] = '*';

		for(i=0x00; i<sizeof(buffer)-2; i++){
			// 判断字符串的结束
			if (ptemp[i] == '\0'){
				break;
			}
			else{	
				buffer[i+1] = toupper( ptemp[i] );	// 将字符转换成“大写”的格式					
			}
		}

		// 该文件的后缀名是否在设定的字符串中出现
		if ( !judge_ext_name(buffer) ) {
			found_flag = 0x01;
		}
	}

	// [02/07/2007] lanzhu add 滤除空文件
	if ( !pFinfo->fileSize  && SPMP_Get_EmptyFileFlag() )
	{
#ifdef QLZ_DEBUG_0208		
		sio_printf(" ------- 滤除空的文件\r\n");
#endif		
		return APP_DRV_ERR;		
	}

	// 带通滤波器只允许符合的通过
	if ( gFilterAttr == SPMP_FILTER_PASS ) {
		if ( found_flag ) {
			return	APP_DRV_OK;
		}

		return APP_DRV_ERR;
	}

	// 带阻滤波器,不让出现的通过
	if ( gFilterAttr == SPMP_FILTER_STOP ) {
		if ( found_flag ) {
			return APP_DRV_ERR;
		}

		return APP_DRV_OK;
	}
}


/************************************************************************/
/*			设定是否检索空文件的标志
  input:
			flag	[in]	UINT16 
								0	不需要过虑空文件 (默认的状态)
							非0值	需要将空文件滤除  (需要进行设置)
  output:
			0 成功, 非0值失败
  func:
                                                                        */
/************************************************************************/



UINT16 SPMP_Set_EmptyFileFlag( UINT16 flag )
{
	// 首先进行复位
	gEmptyFileFlag &= ~ BIT_EMPTY_FILE_MASK;

	// 如果设定了该标志, 进行设定
	if ( flag ) {
		gEmptyFileFlag |= BIT_EMPTY_FILE_MASK;
	}

#ifdef QLZ_DEBUG_0208
	sio_printf("\r\n --- set empty flag = 0x%x\r\n", gEmptyFileFlag);
#endif

	return	APP_DRV_OK; 
}

/************************************************************************/
/*			获取是否滤除空文件的标志
  input:
			void 
  output:
			0		不需要滤除空文件
			非0值	需要滤除空文件
  func:
			获取滤除空文件的标志
                                                                        */
/************************************************************************/
UINT16 SPMP_Get_EmptyFileFlag( void )
{

#ifdef QLZ_DEBUG_0208
	sio_printf("\r\n --- get empty flag = 0x%x\r\n", gEmptyFileFlag);
#endif
	

	return (gEmptyFileFlag & BIT_EMPTY_FILE_MASK);
}

/************************************************************************/
/*	输入一个字符串指针, 判断该字符串是否出现在设定的全局数组中
  input:
			pExtName	[in]	UINT8 * 后缀名字符串指针
  output:
			0 输入字符串出现在设定的名称中, 非0值 输入字符串没有出现
  func:

  note:
			使用全局字符串数组 
			static UINT8 gFilterStr[8][8];   
                                                                        */
/************************************************************************/
static UINT16 judge_ext_name( UINT8 * pExtName )
{
	UINT16 i;

	// 对整个二维数组进行搜索
	for(i=0x00; i<sizeof(gFilterStr)/sizeof(gFilterStr[0]); i++ )
	{
		if ( !strcmp(pExtName, gFilterStr[i]) ) 
		{
			return APP_DRV_OK;	//	找到字符串, 返回0
		}
	}

	// 找不到,返回非0值
	return APP_DRV_ERR;
}

/************************************************************************/
/*	为搜索目录进行准备工作
  input:
			void 
  output:
			0 成功,非0值失败
  func:
			在开始进行目录搜索前,进行准备工作
  note:
			使用全局变量 gpTargetDir  gpCWDBack   
                                                                    */
/************************************************************************/
static UINT16 search_dir_prepare( void )
{
	UINT8 *pCWD;
	UINT8 *ptemp;
	UINT16 len, err;

	// 判断是否已经设置目标目录,没有进行目标设定,返回失败
	if ( NULL == gpTargetDir ) {
		ERROR_REPORT;
		return APP_DRV_ERR;
	}

	fsDirGet(&pCWD);			// 获得当前的工作目录

	len = strlen(pCWD);			// 内存申请, 保存当前的目录字符串
	ptemp = MEM_ALLOC(len+4);	
	if (NULL == ptemp) {
		ERROR_REPORT;
		return APP_DRV_ERR;				
	}

	memset(ptemp, '\0', len+4);
	strcpy(ptemp, pCWD);		// 进行字符串的复制	

	if(ptemp[len-1] == ':'){
		ptemp[len] = '\\';
	}

	// 如果原来已经有内存申请, 进行内存的释放
	if (NULL != gpCWDBack ) {
		MEM_FREE( gpCWDBack );
	}
	gpCWDBack = ptemp;			// 保存内存指针到全局变量中 
	
	ptemp = get_target_dir();	// 获取用户指定的路径	
	if (NULL == ptemp) {
		ERROR_REPORT;
		return APP_DRV_ERR;						
	}
	
	err = fsDirSet(ptemp, 0);	// 切换到用户的指定路径
	if ( err ) {
		ERROR_REPORT;
		return APP_DRV_ERR;								
	}

	return APP_DRV_OK;			// 返回成功
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -