/****************************************************************************** 版权所有: 文件名称: history_file.c 文件版本: 01.01 创建作者: 创建日期: 2016-08-09 功能说明: 历史数据文件操作接口实现文件 其它说明: 修改记录: */ #include "head.h" #include "history_file.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /****************************************************************************** 函数名称: hf_get_filecnt_from_tmpfile 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 从临时文件中获取文件个数 参数说明: tmpfile: 临时文件 cols: 文件名占用的字节数 返回值: 成功返回文件个数 失败返回0 修改记录: */ static int hf_get_filecnt_from_tmpfile(char *tmpfile, int cols) { int ret = 0; struct stat s; // 获取文件属性 if (sys_newstat(tmpfile, &s)) { rt_printf("%s:sys_newstat(%s) error\n", __func__, tmpfile); return 0; } // 因为每行的字节数字是固定的,所以除以每行的字节数就可得出文件个数 ret = s.st_size / (cols + 1); return ret; } /****************************************************************************** 函数名称: hf_get_file_content 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 获取文件内容 参数说明: filename: 文件名 p_file_len: 返回的文件长度 返回值: 成功返回文件内容 失败返回NULL 修改记录: */ static char *hf_get_file_content(char *filename, int *p_file_len) { char *p = NULL; int fd; struct stat s; int ret; // 获取文件属性 if (sys_newstat(filename, &s)) { rt_printf("%s:sys_newstat(%s) error\n", __func__, filename); return NULL; } *p_file_len = s.st_size; p = rt_malloc(s.st_size + 1); // 多一个字节,最后一个字节存放0,便于字符查找方便 if (!p) { rt_printf("%s:rt_malloc eror\r\n", __func__); return NULL; } fd = sys_open(filename, O_RDONLY, 0); if (fd < 0) { rt_printf("sys_open(%s) error\r\n", filename); rt_free(p); return NULL; } ret = sys_read(fd, p, s.st_size); if (ret != s.st_size) { rt_printf("%s:sys_read error\r\n", __func__); rt_free(p); sys_close(fd); return NULL; } sys_close(fd); p[s.st_size] = 0; return p; } /****************************************************************************** 函数名称: hf_get_timedfile_content 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 获取录波文件的内容 参数说明: tmpfile: 临时文件 cols: 文件名占用的字节数 返回值: 成功返回文件个数 失败返回0 修改记录: */ static char *hf_get_timedfile_content(char *dir, int filename, int part, int *p_part_len) { #if 1 char *p = NULL; struct dir_file_ext_struct *p_dfs_ext = NULL; int i = 0; int file_cnt = 0; char tmp[128]; int bfind = 0; p_dfs_ext = hf_get_dir_file_ext(dir, &file_cnt, HF_FRZ_101_TMP); if (!p_dfs_ext) { return NULL; } for (i = 0; i < file_cnt; i++) { if (filename == (i + HF_FIXPT_FILENAME_N)) { bfind = 1; break; } } if (!bfind) { goto END; } sprintf(tmp, "%s%s", dir, p_dfs_ext[i].file_name); p = hf_get_file_content(tmp, p_part_len); END: rt_free(p_dfs_ext); return p; #else char *p = NULL; char *p2; char *pstr; char *cmd_ls[] = {"/app/m", "ls", dir, HF_TIMED_101_TMP, NULL}; char *envp[] = {NULL}; char tmp[128]; char tmp_filename[64]; char cr_line[] = {'\r', '\n', 0}; int cnt; int fd; int i; int ret; int filelen = 0; int addr; // 调用shell脚本,生成文件列表 ret = call_usermodehelper("/app/m", cmd_ls, envp, UMH_WAIT_PROC); // 文件个数 cnt = hf_get_filecnt_from_tmpfile(HF_TIMED_101_TMP, HF_FIXPT_FILENAME_LEN); fd = sys_open(HF_TIMED_101_TMP, O_RDONLY, 0); if (fd < 0) { return NULL; } for (i = 0; i < cnt; i++) { memset(tmp_filename, 0, sizeof(tmp_filename)); ret = sys_read(fd, tmp_filename, HF_FIXPT_FILENAME_LEN + 1); if (ret != HF_FIXPT_FILENAME_LEN + 1) { sys_close(fd); } tmp_filename[HF_FIXPT_FILENAME_LEN] = 0; addr = simple_strtoul(tmp_filename, NULL, 10); if (addr == filename) { sys_close(fd); fd = 0; sprintf(tmp, "%s%s", dir, tmp_filename); p = hf_get_file_content(tmp, &filelen); if (p) { // 读文件头 pstr = strstr(p, cr_line); if (!pstr) { rt_free(p); return NULL; } pstr += 2; pstr = strstr(pstr, cr_line); if (!pstr) { rt_free(p); return NULL; } pstr += 2; for (i = 0; i < (part - 1); i++) { if (pstr >= (p + filelen)) { rt_free(p); return NULL; } pstr = strstr(pstr, cr_line); if (!pstr) { rt_free(p); return NULL; } pstr += 2; } if (*pstr == '\n') // '/A' ? { rt_free(p); return NULL; } p2 = pstr; pstr = strstr(pstr, cr_line); if (!pstr) { rt_free(p); return NULL; } *p_part_len = (int)(pstr - p2); memcpy(p, p2, *p_part_len); } break; } } if (fd > 0) { sys_close(fd); } rt_file_del(HF_TIMED_101_TMP); return p; #endif } /****************************************************************************** 函数名称: hf_get_frzfile_content 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 获取录波文件的内容 参数说明: tmpfile: 临时文件 cols: 文件名占用的字节数 返回值: 成功返回文件个数 失败返回0 修改记录: */ static char *hf_get_frzfile_content(char *dir, int filename, int part, int *p_part_len) { char *p = NULL; struct dir_file_ext_struct *p_dfs_ext = NULL; int i = 0; int file_cnt = 0; char tmp[128]; int bfind = 0; p_dfs_ext = hf_get_dir_file_ext(dir, &file_cnt, HF_FRZ_101_TMP); if (!p_dfs_ext) { return NULL; } for (i = 0; i < file_cnt; i++) { if (filename == (i + HF_FRZ_FILENAME_N)) { bfind = 1; break; } } if (!bfind) { goto END; } sprintf(tmp, "%s%s", dir, p_dfs_ext[i].file_name); p = hf_get_file_content(tmp, p_part_len); END: rt_free(p_dfs_ext); return p; } /****************************************************************************** 函数名称: hf_get_wavefile_content 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 获取录波文件的内容 参数说明: tmpfile: 临时文件 cols: 文件名占用的字节数 返回值: 成功返回文件个数 失败返回0 修改记录: */ static char *hf_get_wavefile_content(char *dir, int filename, int part, int *p_part_len) { char *p = NULL; char *cmd_ls[] = {"/app/m", "ls", dir, HF_WAVE_TMP, NULL}; char *envp[] = {NULL}; char tmp[128]; char tmp_filename[64]; int cnt; int fd; int i; int ret; int addr; // 调用shell脚本,生成文件列表 ret = call_usermodehelper("/app/m", cmd_ls, envp, UMH_WAIT_PROC); // 文件个数 cnt = hf_get_filecnt_from_tmpfile(HF_WAVE_TMP, HF_WAVE_FILE_LENGTH); fd = sys_open(HF_WAVE_TMP, O_RDONLY, 0); if (fd < 0) { return NULL; } for (i = 0; i < cnt; i++) { memset(tmp_filename, 0, sizeof(tmp_filename)); ret = sys_read(fd, tmp_filename, HF_WAVE_FILE_LENGTH + 1); if (ret != HF_WAVE_FILE_LENGTH + 1) { sys_close(fd); } tmp_filename[HF_WAVE_FILE_LENGTH] = 0; addr = simple_strtoul(tmp_filename, NULL, 16); if (addr == filename) { // cfg文件 if ((part == 1) && strstr(tmp_filename, ".cfg")) { sprintf(tmp, "%s%s", dir, tmp_filename); p = hf_get_file_content(tmp, p_part_len); break; } else if ((part == 2) && strstr(tmp_filename, ".dat")) // dat文件 { sprintf(tmp, "%s%s", dir, tmp_filename); p = hf_get_file_content(tmp, p_part_len); break; } } } sys_close(fd); rt_file_del(HF_WAVE_TMP); return p; } /****************************************************************************** 函数名称: hf_get_max_minfile_content 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 获取录波文件的内容 参数说明: tmpfile: 临时文件 cols: 文件名占用的字节数 返回值: 成功返回文件个数 失败返回0 修改记录: */ static char *hf_get_max_minfile_content(char *dir, int filename, int part, int *p_part_len) { #if 1 char *p = NULL; struct dir_file_ext_struct *p_dfs_ext = NULL; int i = 0; int file_cnt = 0; char tmp[128]; int bfind = 0; p_dfs_ext = hf_get_dir_file_ext(dir, &file_cnt, HF_MAX_MIN_101_TMP); if (!p_dfs_ext) { return NULL; } for (i = 0; i < file_cnt; i++) { if (filename == (i + HF_EXV_FILENAME_N)) { bfind = 1; break; } } if (!bfind) { goto END; } sprintf(tmp, "%s%s", dir, p_dfs_ext[i].file_name); p = hf_get_file_content(tmp, p_part_len); END: rt_free(p_dfs_ext); return p; #else char *p = NULL; char *cmd_ls[] = {"/app/m", "ls", dir, HF_MAX_MIN_101_TMP, NULL}; char *envp[] = {NULL}; char tmp[128]; char tmp_filename[64]; int cnt; int fd; int i; int ret; int addr; // 调用shell脚本,生成文件列表 ret = call_usermodehelper("/app/m", cmd_ls, envp, UMH_WAIT_PROC); // 文件个数 cnt = hf_get_filecnt_from_tmpfile(HF_MAX_MIN_101_TMP, HF_EXV_FILENAME_LEN); fd = sys_open(HF_MAX_MIN_101_TMP, O_RDONLY, 0); if (fd < 0) { return NULL; } for (i = 0; i < cnt; i++) { memset(tmp_filename, 0, sizeof(tmp_filename)); ret = sys_read(fd, tmp_filename, HF_EXV_FILENAME_LEN + 1); if (ret != HF_EXV_FILENAME_LEN + 1) { sys_close(fd); return NULL; } tmp_filename[HF_EXV_FILENAME_LEN] = 0; addr = simple_strtoul(tmp_filename, NULL, 10); if (addr == filename) { sprintf(tmp, "%s%s", dir, tmp_filename); p = hf_get_file_content(tmp, p_part_len); break; } } sys_close(fd); rt_file_del(HF_MAX_MIN_101_TMP); return p; #endif } /****************************************************************************** 函数名称: hf_str_to_ts 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 字符串时间转struct timespec 结构时间 参数说明: p_strtime: 字符串时间(比如20141114_192135_830) p_ts: struct timespec时间 返回值: 返回0 修改记录: */ int hf_str_to_ts(char *p_strtime, struct timespec *p_ts) { char tmp[8]; struct rtc_time_t rtc; rt_printf("%s\r\n", p_strtime); memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime, 4); rtc.year = simple_strtoul(tmp, NULL, 10) - 2000; memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 4, 2); rtc.month = simple_strtoul(tmp, NULL, 10); memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 6, 2); rtc.day = simple_strtoul(tmp, NULL, 10); memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 9, 2); rtc.hour = simple_strtoul(tmp, NULL, 10); memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 11, 2); rtc.min = simple_strtoul(tmp, NULL, 10); memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 13, 2); rtc.ms = simple_strtoul(tmp, NULL, 10); rtc.ms *= 1000; memset(tmp, 0, sizeof(tmp)); memcpy(tmp, p_strtime + 16, 3); rtc.ms += simple_strtoul(tmp, NULL, 10); rtc_to_timespec(&rtc, p_ts); return 0; } /****************************************************************************** 函数名称: hf_gen_dfs_wave 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 生成 dir_file_struct *指针(用于多文件的情况) 参数说明: dir: 目录 file_name: 文件名(字符串) file_name_n: 文件名(数字) tmpfile: 临时文件 。主要是用于得到目录文件的个数和文件名称 name_len: 名字长度。比如极值数据,112~141.它的长度就是3。比如定点数据22~51,它的长度就是2 返回值: 如果获取成功,则得到struct dir_file_struct 的指针。使用完毕应当释放内存。 如果获取失败,则返回NULL. 修改记录: */ static struct dir_file_struct *hf_gen_dfs_wave(char *dir, char *tmpfile, int *p_file_cnt) { struct dir_file_struct *p_dfs = NULL; int ret; char tmp[128]; struct stat s; int i; int len = HF_WAVE_FILE_LENGTH; ret = hf_get_filecnt_from_tmpfile(tmpfile, len); *p_file_cnt = ret; if (ret > 0) { int fd; char tmp2[128]; int cnt; p_dfs = rt_malloc(ret * sizeof(struct dir_file_struct)); if (!p_dfs) { return NULL; } memset(tmp, 0, sizeof(tmp)); fd = sys_open(tmpfile, O_RDONLY, 0); if (fd < 0) { rt_printf("sys_open(%s) error\r\n", tmpfile); rt_free(p_dfs); return NULL; } cnt = ret; for (i = 0; i < cnt; i++) { ret = sys_read(fd, tmp, len + 1); // 包括换行符 if (ret != (len + 1)) { rt_printf("sys_read error\r\n"); rt_free(p_dfs); sys_close(fd); } tmp[28] = 0; p_dfs[i].file_name = simple_strtoul(tmp, NULL, 16); sprintf(tmp2, "%s%s", dir, tmp); if (sys_newstat(tmp2, &s)) { rt_printf("%s:sys_newstat(%s) error\n", __func__, tmp2); rt_free(p_dfs); sys_close(fd); } p_dfs[i].file_size = s.st_size; p_dfs[i].file_time.tv_nsec = 0; hf_str_to_ts(tmp + 5, &p_dfs[i].file_time); } sys_close(fd); } return p_dfs; } /****************************************************************************** 函数名称: hf_gen_dfs_ext 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 生成 dir_file_struct *指针(用于多文件的情况) 参数说明: dir: 目录 file_name: 文件名(字符串) file_name_n: 文件名(数字) tmpfile: 临时文件 。主要是用于得到目录文件的个数和文件名称 name_len: 名字长度。比如极值数据,112~141.它的长度就是3。比如定点数据22~51,它的长度就是2 返回值: 如果获取成功,则得到struct dir_file_struct 的指针。使用完毕应当释放内存。 如果获取失败,则返回NULL. 修改记录: */ #if 1 static struct dir_file_struct *hf_gen_dfs_ext(char *dir, int *p_file_cnt, char *tmpfile, int filename_base, int filename_max) { struct dir_file_struct *p_dfs = NULL; struct dir_file_ext_struct *p_dfs_ext = NULL; int i = 0; p_dfs_ext = hf_get_dir_file_ext(dir, p_file_cnt, tmpfile); if (!p_dfs_ext) { return NULL; } p_dfs = rt_malloc((*p_file_cnt) * sizeof(struct dir_file_struct)); if (!p_dfs) { rt_free(p_dfs_ext); return NULL; } for (i = 0; i < *p_file_cnt; i++) { if (((filename_base + i) >= filename_base) && ((filename_base + i) <= filename_max)) { p_dfs[i].file_name = filename_base + i; p_dfs[i].file_size = p_dfs_ext[i].file_size; p_dfs[i].file_time = p_dfs_ext[i].file_time; strcpy(p_dfs[i].name, p_dfs_ext[i].file_name); } } rt_free(p_dfs_ext); return p_dfs; } #else static struct dir_file_struct *hf_gen_dfs_ext(char *dir, char *file_name, int file_name_n, char *tmpfile, int name_len, int *p_file_cnt) { struct dir_file_struct *p_dfs = NULL; int ret; char tmp[128]; int len = strlen(file_name); struct stat s; int i; file_name_n = file_name_n; ret = hf_get_filecnt_from_tmpfile(tmpfile, len); *p_file_cnt = ret; if (ret > 0) { int fd; char tmp2[128]; int cnt; p_dfs = rt_malloc(ret * sizeof(struct dir_file_struct)); if (!p_dfs) { return NULL; } memset(tmp, 0, sizeof(tmp)); fd = sys_open(tmpfile, O_RDONLY, 0); if (fd < 0) { rt_printf("sys_open(%s) error\r\n", tmpfile); rt_free(p_dfs); return NULL; } cnt = ret; for (i = 0; i < cnt; i++) { ret = sys_read(fd, tmp, len + name_len + 1); // 包括换行符 if (ret != (len + name_len + 1)) { rt_printf("sys_read error\r\n"); rt_free(p_dfs); sys_close(fd); } tmp[len + name_len] = 0; p_dfs[i].file_name = simple_strtoul(tmp, NULL, 10); sprintf(tmp2, "%s%s", dir, tmp); if (sys_newstat(tmp2, &s)) { rt_printf("%s:sys_newstat(%s) error\n", __func__, tmp2); rt_free(p_dfs); sys_close(fd); } p_dfs[i].file_size = s.st_size; p_dfs[i].file_time.tv_nsec = 0; p_dfs[i].file_time.tv_sec = s.st_ctime + 8 * 60 * 60; } sys_close(fd); } return p_dfs; } #endif /****************************************************************************** 函数名称: hf_gen_dfs 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 生成 dir_file_struct *指针 参数说明: dir: 目录 file_name: 文件名(字符串) file_name_n: 文件名(数字) 返回值: 如果获取成功,则得到struct dir_file_struct 的指针。使用完毕应当释放内存。 如果获取失败,则返回NULL. 修改记录: */ static struct dir_file_struct *hf_gen_dfs(char *dir, char *file_name, int file_name_n) { struct dir_file_struct *p_dfs = NULL; struct stat s; char tmp[128]; #if 0 if(file_cnt==1) { #endif sprintf(tmp, "%s%s", dir, file_name); // 获取文件属性 if (sys_newstat(tmp, &s)) { rt_printf("%s:sys_newstat(%s) error\n", __func__, tmp); return NULL; } p_dfs = rt_malloc(sizeof(struct dir_file_struct)); if (!p_dfs) { return NULL; } p_dfs->file_name = file_name_n; p_dfs->file_size = s.st_size; p_dfs->file_time.tv_nsec = 0; p_dfs->file_time.tv_sec = s.st_ctime + 8 * 60 * 60; strcpy(p_dfs->name, file_name); #if 0 } else { p_dfs=rt_malloc(sizeof(struct dir_file_struct)*file_cnt); if(!p_dfs) { return NULL; } for(i=0;i ts1.tv_sec) || ((p_dfes[i].file_time.tv_sec == ts1.tv_sec) && (p_dfes[i].file_time.tv_nsec >= ts1.tv_nsec)); c2 = (p_dfes[i].file_time.tv_sec < ts2.tv_sec) || ((p_dfes[i].file_time.tv_sec == ts2.tv_sec) && (p_dfes[i].file_time.tv_nsec <= ts2.tv_nsec)); if (c1 && c2) { cnt++; } } p_dfs = rt_malloc(cnt * sizeof(struct dir_file_struct)); if (!p_dfs) { rt_printf("%s: rt_malloc error \n", __func__); rt_free(p_dfes); return NULL; } j = 0; // 查找符合条件的文件 for (i = 0; i < *p_file_cnt; i++) { c1 = (p_dfes[i].file_time.tv_sec > ts1.tv_sec) || ((p_dfes[i].file_time.tv_sec == ts1.tv_sec) && (p_dfes[i].file_time.tv_nsec >= ts1.tv_nsec)); c2 = (p_dfes[i].file_time.tv_sec < ts2.tv_sec) || ((p_dfes[i].file_time.tv_sec == ts2.tv_sec) && (p_dfes[i].file_time.tv_nsec <= ts2.tv_nsec)); if (c1 && c2) { memcpy(p_dfs[j].name, p_dfes[i].file_name, 64); p_dfs[j].file_size = p_dfes[i].file_size; p_dfs[j].file_time = p_dfes[i].file_time; j++; } } *p_file_cnt = cnt; } rt_free(p_dfes); return p_dfs; } /****************************************************************************** 函数名称: hf_get_file_inf_n 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 根据文件名称,获取文件内容,将 文件ID及文件长度赋值 ,返回文件内容指针 参数说明: filename : 文件名称 id :文件ID ,如何定义,暂时没有规定,可自主定义,保证文件ID的唯一即可, filelenth : 文件长度 返回值:文件内容的指针索引 修改记录: */ char *hf_get_file_inf_n(char *file_name, uint32_t *id, int *filelenth) { int fd; struct stat s; char *p; // 获取文件属性 if (sys_newstat(file_name, &s)) { rt_printf("%s: sys_newstat(%s)error \n", __func__, file_name); return NULL; } #ifdef HISFILE_ID *id = (uint32_t)s.st_ino; #else *id = 0; // 将文件ID默认为 0 #endif *filelenth = (int)s.st_size; fd = sys_open(file_name, O_RDONLY, 0); if (fd < 0) { rt_printf("%s:sys_open(%s)error \n", __func__, file_name); return NULL; } p = rt_malloc(s.st_size); if (!p) { sys_close(fd); return NULL; } if (sys_read(fd, p, s.st_size) != s.st_size) { rt_printf("%s:sys_read error \n", __func__); rt_free(p); sys_close(fd); return NULL; } sys_close(fd); return p; } /****************************************************************************** 函数名称: hf_init 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 初始化历史文件 参数说明: 返回值:成功返回0,失败返回-1; 修改记录: */ int hf_init(void) { rt_file_mkdir(HF_HISTORY_DIR); rt_file_mkdir(HF_SOE_101_DIR); rt_file_mkdir(HF_CO_101_DIR); rt_file_mkdir(HF_EXV_101_DIR); rt_file_mkdir(HF_FIXPT_101_DIR); rt_file_mkdir(HF_FRZ_101_DIR); rt_file_mkdir(HF_FLOWREV_101_DIR); rt_file_mkdir(HF_LOG_101_DIR); #ifdef HISTORY_EVENT_EXT rt_file_mkdir(HF_SOECOS_101_DIR); #endif // 录波文件目录HF_WAVE_DIR在录波文件实现文件Record.c中创建 rt_file_mkdir(HF_HISTORY_DB_INFO); return 0; } /****************************************************************************** 函数名称: hf_init 函数版本: 01.01 创建作者: 创建日期: 2016-08-09 函数说明: 初始化历史文件 参数说明: 返回值:成功返回0,失败返回-1; 修改记录: */ int hf_exit(void) { return 0; } void testhf(void) { struct dir_file_struct *p_dfs; int file_cnt; struct rtc_time_t tm; int i; p_dfs = hf_get_dir_file(HF_FIXPT_101_DIR, &file_cnt); if (p_dfs) { rt_printf("目录%s\r\n", HF_FIXPT_101_DIR); rt_printf("文件个数:%d p=%p\r\n", file_cnt, p_dfs); for (i = 0; i < file_cnt; i++) { rt_printf("文件名称:%d\r\n", p_dfs[i].file_name); rt_printf("名称:%s\r\n", p_dfs[i].name); rt_printf("文件大小:%d\r\n", p_dfs[i].file_size); timespec_to_rtc(p_dfs[i].file_time, &tm, 0); rt_printf("创建时间:20%02hu-%02hu-%02hu %02hu:%02hu:%02hu \r\n", tm.year, tm.month, tm.day, tm.hour, tm.min, tm.ms / 1000); } rt_printf("\r\n\r\n"); rt_free(p_dfs); } #if 0 struct dir_file_ext_struct *p_dfs; int file_cnt; struct rtc_time_t tm; int i; p_dfs=hf_get_dir_file_ext("/app/data/rec_wave/", &file_cnt, "/tmp/123"); if(p_dfs) { rt_printf("目录%s\r\n", "/app/data/rec_wave/"); rt_printf("文件个数:%d\r\n", file_cnt); for(i=0;ifile_name); rt_printf("文件大小:%d\r\n", p_dfs->file_size); timespec_to_rtc(p_dfs->file_time, &tm, 0); rt_printf("创建时间:20%02hu-%02hu-%02hu %02hu:%02hu:%02hu \r\n",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.ms/1000); rt_printf("\r\n\r\n"); rt_free(p_dfs); } p_dfs=hf_get_dir_file(HF_SOE_104_DIR, &file_cnt); if(p_dfs) { rt_printf("目录%s\r\n", HF_SOE_104_DIR); rt_printf("文件个数:%d\r\n", file_cnt); rt_printf("文件名称:%d\r\n", p_dfs->file_name); rt_printf("文件大小:%d\r\n", p_dfs->file_size); timespec_to_rtc(p_dfs->file_time, &tm, 0); rt_printf("创建时间:20%02hu-%02hu-%02hu %02hu:%02hu:%02hu \r\n",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.ms/1000); rt_printf("\r\n\r\n"); rt_free(p_dfs); } p_dfs=hf_get_dir_file(HF_CO_101_DIR, &file_cnt); if(p_dfs) { rt_printf("目录%s\r\n", HF_CO_101_DIR); rt_printf("文件个数:%d\r\n", file_cnt); rt_printf("文件名称:%d\r\n", p_dfs->file_name); rt_printf("文件大小:%d\r\n", p_dfs->file_size); timespec_to_rtc(p_dfs->file_time, &tm, 0); rt_printf("创建时间:20%02hu-%02hu-%02hu %02hu:%02hu:%02hu \r\n",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.ms/1000); rt_printf("\r\n\r\n"); rt_free(p_dfs); } p_dfs=hf_get_dir_file(HF_CO_104_DIR, &file_cnt); if(p_dfs) { rt_printf("目录%s\r\n", HF_CO_104_DIR); rt_printf("文件个数:%d\r\n", file_cnt); rt_printf("文件名称:%d\r\n", p_dfs->file_name); rt_printf("文件大小:%d\r\n", p_dfs->file_size); timespec_to_rtc(p_dfs->file_time, &tm, 0); rt_printf("创建时间:20%02hu-%02hu-%02hu %02hu:%02hu:%02hu \r\n",tm.year,tm.month,tm.day,tm.hour,tm.min,tm.ms/1000); rt_printf("\r\n\r\n"); rt_free(p_dfs); } p_dfs=hf_get_dir_file(HF_EXV_101_DIR, &file_cnt); if(p_dfs) { rt_printf("目录%s\r\n", HF_EXV_101_DIR); rt_printf("文件个数:%d\r\n", file_cnt); for(i=0;i