/****************************************************************************** 版权所有: 文件名称: 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= (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 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=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;ifile_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;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