| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- /************************************************************************
- * AUTHOR: NiuJiuRu
- * FILENAME: swfile.c
- * CONTENT: 常用的文件操作接口函数
- * NOTE:
- * HISTORY:
- * 1, [2010-08-19] created by NiuJiuRu
- * 2, [2014-01-10] 整体优化修改
- * 3, [2014-01-22] 整体优化修改
- * 4, [2014-06-24] a) 修正"sw_file_setCfgString()"函数设置已存在的节时, 无
- * 法设置成功的问题
- * b) 修正"sw_file_setCfgString()"函数自动新增的节前没有回
- * 车换行的问题
- * c) 加强"sw_file_setCfgString()"函数的缓存溢出判断
- ************************************************************************/
- #include "swapi.h"
- #include "swstring.h"
- #include "swfile.h"
- /* 装载文件 */
- int sw_file_load(const char *path, const char *mode, char *buf, int bufSize)
- {
- FILE *fp = NULL;
- int filesize = 0, readsize = 0;
- if(!path || !mode || !buf || bufSize < 0) return -1;
-
- filesize = sw_file_getSize(path);
- if(filesize < 0) return -1;
- else if(filesize == 0) return 0;
- fp = fopen(path, mode);
- if(!fp) return -1;
- if(filesize > bufSize) readsize = -1;
- else readsize = fread(buf, sizeof(char), filesize, fp);
- fclose(fp);
- return readsize;
- }
- /* 更新文件 */
- int sw_file_update(const char *path, const char *mode, const char *buf, int bufSize)
- {
- FILE *fp = NULL;
- int writesize = 0;
- if(!path || !mode || !buf || bufSize < 0) return -1;
- fp = fopen(path, mode);
- if(!fp) return -1;
- if(bufSize > 0) writesize = fwrite(buf, sizeof(char), bufSize, fp);
- fclose(fp);
- return writesize;
- }
- /* 得到文件大小 */
- int sw_file_getSize(const char *path)
- {
- struct stat statBuf = { 0 };
- if(!path) return -1;
- if(stat(path, &statBuf) == 0) return statBuf.st_size;
- else return -1;
- }
- /* 重命名文件 */
- int sw_file_rename(const char *oldName, const char *newName)
- {
- return rename(oldName, newName);
- }
- /* 拷贝文件 */
- int sw_file_copy(const char *existingFilename, const char *newFilename, bool failIfExists)
- {
- char *pBuf = NULL;
- int filesize = 0;
- if(!existingFilename || !newFilename || (failIfExists && sw_file_exists(newFilename))) return -1;
- filesize = sw_file_getSize(existingFilename);
- if(filesize < 0) return -1;
- pBuf = (char *)malloc(filesize);
- if(!pBuf) return -1;
- if(sw_file_load(existingFilename, "rb", pBuf, filesize) != filesize || \
- sw_file_update(newFilename, "wb", pBuf, filesize) != filesize) filesize = -1;
- free(pBuf);
- return filesize;
- }
- /* 删除文件 */
- int sw_file_delete(const char *path)
- {
- return remove(path);
- }
- /* 判断文件是否存在 */
- bool sw_file_exists(const char *path)
- {
- if(access(path, 0) == 0) return true;
- else return false;
- }
- /* 读配置或字典文件(mode : "GetFieldName", 根据"字段值"获取"字段名"; "GetFieldValue", 根据"字段名"获取"字段值") */
- char *sw_file_getCfgString(const char *path, const char *section, const char *mode, char *field, char *value, int resultBufSize)
- {
- char *pBuf = NULL, *pSection = NULL, *pStr = NULL;
- int filesize = 0;
- if(!path || !mode || !field || !value || resultBufSize <= 0) return NULL;
- filesize = sw_file_getSize(path);
- if(filesize <= 0) return NULL;
- pBuf = (char *)malloc(filesize+1);
- if(!pBuf) return NULL;
- if(sw_file_load(path, "rb", pBuf, filesize) != filesize) goto EndP;
- else pBuf[filesize] = '\0';
- if(section)
- {
- pSection = xstrcasestr(pBuf, "left", section);
- if(!pSection) goto EndP;
- }
- else pSection = pBuf;
- if(xstrcasecmp(mode, "GetFieldName") == 0)
- pStr = sw_str_getFieldName(pSection, filesize-(pSection-pBuf), 0, field, resultBufSize, value);
- else if(xstrcasecmp(mode, "GetFieldValue") == 0)
- pStr = sw_str_getFieldValue(pSection, filesize-(pSection-pBuf), 0, field, value, resultBufSize);
- EndP:
- free(pBuf);
- return pStr;
- }
- /* 写配置或字典文件(mode : "SetFieldName", 根据"字段值"设置"字段名"; "SetFieldValue", 根据"字段名"设置"字段值") */
- bool sw_file_setCfgString(const char *path, const char *section, const char *mode, const char *field, const char *value, bool autoAdd)
- {
- char *pBuf = NULL, *pSection = NULL;
- int filesize = 0, varysize1 = 0, varysize2 = 0;
- bool bRet = false;
- if(!path || !mode || !field || !value) return false;
- filesize = sw_file_getSize(path);
- if(filesize < 0) filesize = 0;
- pBuf = (char *)malloc(filesize+MAX_LINE_CHARS*2);
- if(!pBuf) return false;
- if(filesize > 0 && sw_file_load(path, "rb", pBuf, filesize) != filesize) goto EndP;
- memset(pBuf+filesize, 0, MAX_LINE_CHARS*2);
- if(section)
- {
- pSection = xstrcasestr(pBuf, "left", section);
- if(!pSection)
- {
- if(autoAdd && (strlen(section)+4) <= MAX_LINE_CHARS)
- {
- pSection = pBuf+filesize;
- sprintf(pSection, "\r\n%s\r\n", section);
- varysize1 = strlen(section)+4;
- }
- else goto EndP;
- }
- }
- else pSection = pBuf;
- if((strlen(field)+strlen(value)) > MAX_LINE_CHARS) goto EndP;
- if(xstrcasecmp(mode, "SetFieldName") == 0)
- {
- bRet = sw_str_setFieldName(pSection, filesize+MAX_LINE_CHARS*2-(pSection-pBuf), 0, field, value, autoAdd, &varysize2);
- if(!bRet) goto EndP;
- }
- else if(xstrcasecmp(mode, "SetFieldValue") == 0)
- {
- bRet = sw_str_setFieldValue(pSection, filesize+MAX_LINE_CHARS*2-(pSection-pBuf), 0, field, value, autoAdd, &varysize2);
- if(!bRet) goto EndP;
- }
- if(bRet) bRet = (sw_file_update(path, "wb", pBuf, filesize+varysize1+varysize2) == filesize+varysize1+varysize2);
- EndP:
- free(pBuf);
- return bRet;
- }
- /* 从配置或字典文件中删除(mode : "DelFieldByName", 根据"字段名"删除该"字段"; "DelFieldByValue", 根据"字段值"删除该"字段") */
- bool sw_file_delCfgString(const char *path, const char *section, const char *mode, const char *field, const char *value)
- {
- char *pBuf = NULL, *pSection = NULL;
- int filesize = 0, varysize = 0;
- bool bRet = false;
- if(!path || !mode || (!field && !value)) return false;
- filesize = sw_file_getSize(path);
- if(filesize < 0) return false;
- else if(filesize == 0) return true;
- pBuf = (char *)malloc(filesize+1);
- if(!pBuf) return false;
- if(sw_file_load(path, "rb", pBuf, filesize) != filesize) goto EndP;
- else pBuf[filesize] = '\0';
- if(section)
- {
- pSection = xstrcasestr(pBuf, "left", section);
- if(!pSection) { bRet = true; goto EndP; }
- }
- else pSection = pBuf;
- if(xstrcasecmp(mode, "DelFieldByName") == 0)
- {
- bRet = sw_str_delFieldByName(pSection, filesize-(pSection-pBuf), 0, field, &varysize);
- if(!bRet) goto EndP;
- }
- else if(xstrcasecmp(mode, "DelFieldByValue") == 0)
- {
- bRet = sw_str_delFieldByValue(pSection, filesize-(pSection-pBuf), 0, value, &varysize);
- if(!bRet) goto EndP;
- }
- if(bRet) bRet = (sw_file_update(path, "wb", pBuf, filesize+varysize) == filesize+varysize);
- EndP:
- free(pBuf);
- return bRet;
- }
|