version 1:
//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录 void VappVideoListPage::delVideoInfoTableInDB(void) { FS_HANDLE fh = 0; fh = FS_Open((const WCHAR*)L"D:\\@MediaCache\\Gallery.db", FS_READ_ONLY);//L"D:\\@MediaCache\\Gallery.db" //如果该文件不存在,则直接退出 if(fh < FS_NO_ERROR) { return; } FS_Close(fh); fh = -1; if(NULL == m_videoDB) { VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this); } //当数据库中内容达到1024条记录时删除掉该数据库文件 if(m_videoDB->getCurrVideoTotalNumber() >= (MAX_CUR_DB_VIDEO_NUMBER - 24))//(MAX_CUR_DB_VIDEO_NUMBER/2)) { VFX_OBJ_CLOSE(m_videoDB); FS_Delete((const WCHAR *)L"D:\\@MediaCache\\Gallery.db"); } VFX_OBJ_CLOSE(m_videoDB); }
//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录 void VappVideoListPage::delVideoInfoTableInDB(void) { WCHAR folder_path[SRV_FMGR_PATH_MAX_LEN + 1] = {0}; FS_HANDLE fh = 0; kal_wsprintf(folder_path, "%c:\\%w", SRV_FMGR_PHONE_DRV, L"@MediaCache\\Gallery.db"); fh = FS_Open((const WCHAR*)folder_path, FS_READ_ONLY);//L"D:\\@MediaCache\\Gallery.db" //如果该文件不存在,则直接退出 if(fh < FS_NO_ERROR) { return; } FS_Close(fh); fh = -1; if(NULL == m_videoDB) { VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this); } //当数据库中内容达到1024条记录时删除掉该数据库文件 if(m_videoDB->getCurrVideoTotalNumber() >= (MAX_CUR_DB_VIDEO_NUMBER - 24))//(MAX_CUR_DB_VIDEO_NUMBER/2)) { VFX_OBJ_CLOSE(m_videoDB); FS_Delete((const WCHAR *)folder_path); } VFX_OBJ_CLOSE(m_videoDB); }
//如果当前数据库文件中 video_info 表中记录元素达到1000个视频的话,会清除掉该表中所有的记录 //模拟器上该db的路径是 L"D:\\@MediaCache\\Gallery.db",真机上路径是 L"C:\\@MediaCache\\Gallery.db" //注意真机上手机盘符是C,而模拟器上手机盘符是D void VappVideoListPage::delVideoDBFile(void) { FS_HANDLE fh = 0; WCHAR* folder_path = NULL; U32 buff_size = (SRV_FMGR_PATH_MAX_LEN + 1 ) * sizeof(WCHAR); VFX_SYS_ALLOC_MEM(folder_path, (SRV_FMGR_PATH_MAX_LEN + 1 ) * sizeof(WCHAR)); //如果申请空间失败,则直接退出 if(!folder_path) { return; } kal_wsprintf(folder_path, "%c:\\%w", SRV_FMGR_PHONE_DRV, L"@MediaCache\\Gallery.db"); fh = FS_Open((const WCHAR*)folder_path, FS_READ_ONLY); //如果该文件不存在,则直接退出 if(fh < FS_NO_ERROR) { kal_prompt_trace(MOD_NIL,"gallery.db is not exist..."); return; } kal_prompt_trace(MOD_NIL,"gallery.db is exist!!!"); FS_Close(fh); fh = -1; if(NULL == m_videoDB) { VFX_OBJ_CREATE(m_videoDB, VappGalleryDB, this); } //当数据库中内容达到1000条记录时删除掉该数据库文件 S32 count = m_videoDB->getCurrVideoTotalNumber(); kal_prompt_trace(MOD_NIL,"gallery.db video_info has %d records",count); if(count >= (MAX_CUR_DB_VIDEO_NUMBER - 24)) { VFX_OBJ_CLOSE(m_videoDB); FS_Delete((const WCHAR *)folder_path); kal_prompt_trace(MOD_NIL,"gallery.db delete succees!!!"); } else { VFX_OBJ_CLOSE(m_videoDB); } VFX_SYS_FREE_MEM(folder_path); }
能看出这三个版本的区别吗?
Gallery.db文件是存在 手机盘:\@MediaCache\ 目录下
1,version 2中主要是修改了绝对路径的引用,因为在真机上手机盘符为 C,而在模拟器上手机盘符为 D
在自测试的时候发现模拟器上删除ok,而在真机上不ok,才查到此原因的。
2,version 2中为了获取手机盘盘符使用了一个大的字符数组,总共520个字节,由于在嵌入式上编程,栈空间太小,总共大约22K吧,
如果调用层级太深的话,而且每层函数上面挂的局部变量太多,很容易把栈空间撑爆。这一点必须注意。
3,version 3中动态申请内存空间,该部分内存在系统堆上面。这里面添加了必要的trace信息可以查看是否在真机上有操作成功。
另外 version 3中修改了函数名,是删除整个db文件,而非db中的一个表。词更达意,自注释性更好。
优化代码要考虑的东西真不少...
version 4:
VFX_SYS_ALLOC_MEM(folder_path, buff_size); //如果申请空间失败,则直接退出 if(!folder_path) { return; } memset(folder_path, 0x00, buff_size);
version 3 中犯了一个常识性的错误,不知道您看出来没,在申请到内存成功后,应将申请到的那一片空间清零,
由于 folder_path 中并没有结束符,如果不清空的话,导致 folder_path 后面可能正好连接的是一块脏数据,那这个地址就失效了。