MTK优美代码赏析7文件搜索与匹配_第1页
MTK优美代码赏析7文件搜索与匹配_第2页
MTK优美代码赏析7文件搜索与匹配_第3页
MTK优美代码赏析7文件搜索与匹配_第4页
MTK优美代码赏析7文件搜索与匹配_第5页
已阅读5页,还剩1页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MTK优美代码赏析7:文件搜索与匹配

最近因需要拓展音乐播放器功能,研究了下MTK的文件系统,趁周末我总结一下关于文件系统关键的接口<文件搜索与匹配>MTK实现的方法。

关于文件搜索,因为都是基于FAT格式的系统,所以MTK文件处理的思路和Window是很相似的。

通过FindFirstFile函数获取操作句柄HANDLE,将此句柄作为参数传入FindNextFile函数,通过FindNextFile不断搜索下一个文件/文件夹,当FindNextFile返回值为0时表示搜索完成,查询完成后通过FindClose关闭句柄。

对应MTK中的接口为FS_FindFirst,FS_FindNext和FS_FindClose,下面拿一段代码来看(来自aud_vr_sd.c)//作者:张素丰,转载请注明出处:/?p=237

/*****************************************************************************

*

FUNCTION

*

aud_vr_sd_scan_tags_in_group_folder

*

DESCRIPTION

*

vr

sd

scan

all

tags

in

a

group

folder

*

PARAMETERS

*

group_id

[IN]

*

path

[?]

*

RETURNS

*

void

*****************************************************************************/

void

aud_vr_sd_scan_tags_in_group_folder(kal_uint16

group_id,

kal_uint16

*path)

{

/*----------------------------------------------------------------*/

/*

Local

Variables

*/

/*----------------------------------------------------------------*/

kal_uint16

filename[VR_MAX_DB_PATH_LEN

+

1];

kal_uint16

filename_expr[VR_MAX_DB_PATH_LEN

+

1];

kal_int32

word_id;

FS_HANDLE

fd_cursor;

FS_DOSDirEntry

file_info;

/*----------------------------------------------------------------*/

/*

Code

Body

*/

/*----------------------------------------------------------------*/

vr_sd_ctx.id_length[group_id]

=

0;

kal_wsprintf(filename_expr,

"%wMTKVR_????.vrd",

path);

if

((fd_cursor

=

FS_FindFirst(filename_expr,

0,

0,

&file_info,

filename,

(VR_MAX_DB_PATH_LEN

+

1)

<<

1))

>=

0)

{

/*

loop

through

all

vrd

files

in

a

group

folder

*/

do

{

/*

filter

out

folder

results

*/

if

(!(file_info.Attributes

&

FS_ATTR_DIR))

{

/*

parse

word

id

and

add

to

id

array

and

increment

id

length

*/

if

((word_id

=

aud_vr_sd_extract_word_id(filename))

>=

0)

{

vr_sd_ctx.id_array[group_id][vr_sd_ctx.id_length[group_id]++]

=

word_id;

}

}

}

while

(FS_FindNext(fd_cursor,

&file_info,

filename,

(VR_MAX_DB_PATH_LEN

+

1)

<<

1)

==

FS_NO_ERROR);

FS_FindClose(fd_cursor);

}

}

下面讲一讲匹配,这里所说的匹配主要是将文件格式(即后缀名)的匹配,在获取到文件名以后进行。

思路也都是相同的,那就是从文件名末端开始搜索到第一个".",然后截取"."后面这一段作为拓展名,然后把这个拓展名拿到自己的需要的格式列表中对比即可。

MTK中有两种方式实现了这个需求,

方式1(来自FileManagerSrc.c):

/*****************************************************************************

*

FUNCTION

*

mmi_fmgr_get_file_group

*

DESCRIPTION

*

check

file

type

belongs

to

which

file

group

*

PARAMETERS

*

path

[?]

*

RETURNS

*

void

*****************************************************************************/

U8

mmi_fmgr_get_file_group(S8

*path)

{

/*----------------------------------------------------------------*/

/*

Local

Variables

*/

/*----------------------------------------------------------------*/

FMGR_FILTER

file_type;

S32

result;

/*----------------------------------------------------------------*/

/*

Code

Body

*/

/*----------------------------------------------------------------*/

result

=

mmi_fmgr_get_file_type(path,

&file_type);

if

(result

==

FS_FILE_NOT_FOUND)

{

return

FMGR_GROUP_UNKNOWN;

}

if

(FMGR_FILTER_IS_SET_AUDIO(&file_type))

{

return

FMGR_GROUP_AUDIO;

}

else

if

(FMGR_FILTER_IS_SET_IMAGE(&file_type))

{

return

FMGR_GROUP_IMAGE;

}

else

if

(FMGR_FILTER_IS_SET_VIDEO(&file_type))

{

return

FMGR_GROUP_VIDEO;

}

else

if

(FMGR_FILTER_IS_SET_SWFLASH(&file_type))

{

return

FMGR_GROUP_SWFLASH;

}

else

{

return

FMGR_GROUP_UNKNOWN;

}

}

在mmi_fmgr_get_file_type函数内实现了相应的逻辑,这个流程依赖于FileMgr.c中constfmgr_filter_structfmgr_filter[FMGR_MAX_FILTER_COUNT];

方式2:依赖于系统的全局变量的东西有时并不能满足我们应用的需求,这个时候我们需要自己定义一个私有的fmgr_filter,来实现拓展名的判断。

这个流程的实现可以参照09A代码AudioPlayerPlayList.c中mmi_audply_playlist_generate_search函数。

下面来对比两个获取后缀名的函数:

/*****************************************************************************

*

FUNCTION

*

mmi_fmgr_extract_ext_file_name

*

DESCRIPTION

*

get

pointer

to

the

extension

file

name

in

the

file

path

*

PARAMETERS

*

path

[?]

*

RETURNS

*

void

*****************************************************************************/

PS8

mmi_fmgr_extract_ext_file_name(S8

*path)

{

/*----------------------------------------------------------------*/

/*

Local

Variables

*/

/*----------------------------------------------------------------*/

S16

i,

length;

/*----------------------------------------------------------------*/

/*

Code

Body

*/

/*----------------------------------------------------------------*/

length

=

(S16)

mmi_ucs2strlen(path);

i

=

length

-

1;

while

(i

>=

0)

{

if

(path[i

<<

1]

==

'\\'

&&

path[(i

<<

1)

+

1]

==

0)

{

return

NULL;

}

if

(path[i

<<

1]

==

'.'

&&

path[(i

<<

1)

+

1]

==

0

&&

(i

!=

length

-

1))

{

break;

}

i--;

}

if

(i

<

0)

{

return

NULL;

}

return

&path[(i

+

1)

<<

1];

}

另一种系统string处理的接口:/*****************************************************************************

*

FUNCTION

*

app_ucs2_strrchr

*

DESCRIPTION

*

Scan

a

UCS2

encoded

string

for

the

last

occurrence

of

a

character.

*

PARAMETERS

*

string

[IN]

UCS2

encoded

string

to

search

in.

*

ch

[IN]

UCS2

encoded

wide-character

to

search

for.

*

RETURNS

*

returns

pointer

to

the

last

occurrence

of

ch

in

string

*

returns

NULL

if

ch

does

not

occur

in

string

*****************************************************************************/

kal_int8

*app_ucs2_strrchr(const

kal_int8

*

string,

kal_wchar

ch)

{

/*----------------------------------------------------------------*/

/*

Local

Variables

*/

/*----------------------------------------------------------------*/

kal_int8

*cursor

=

(kal_int8

*)string;

/*----------------------------------------------------------------*/

/*

Code

Body

*/

/*----------------------------------------------------------------*/

while

(*cursor

||

*(cursor+1))

/*

find

end

of

string

*/

{

cursor

+=

2;

}

/*

search

towards

front

*/

while

((kal_int8

*)string

!=

cursor

&&

(*(cursor+1)<<8|(kal_uint8)(*cursor))

!=

ch)

{

cursor

-=

2;

}

if

((*(cursor+1)<<8|(kal_uint8)(*cursor))

==

ch)

/*

found

?*/

{

return

cursor;

}

return

NULL;

}

PS8

test(const

UI_string_type

ext)

{

/*----------------------------------------------------------------*/

/*

Local

Variables

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论