📄 pmp_file_list.c
字号:
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 + -