自研工具类库:提升开发效率的实用之选

在软件开发的漫长历程中,开发者常常面临重复编写常用功能代码的困境,这不仅耗时费力,还容易引入错误。为打破这一僵局,提升开发效率,我精心打造了一套多功能工具类库。接下来,我将为大家详细介绍这套工具类库的具体内容。

一、工具类库概览

这套工具类库涵盖了文件操作、日志记录、程序启动管理、时间处理、配置读取以及 IP 地址验证等多个关键领域,旨在一站式解决开发过程中的常见问题。

(一)文件操作:FileUtil 类

在实际开发中,文件操作是非常频繁的任务。FileUtil类提供了两个极为实用的方法:

  • GetFileNames:用于遍历指定目录下的所有文件名称。它借助_findfirst和_findnext函数,高效地查找文件,并将文件名存入std::vectorstd::string中。当你需要获取某个文件夹下的所有文件列表时,这个方法就能派上用场。例如,在一个文件管理系统中,要展示某个目录下的所有文件,调用UTIL_GetFileNames方法,传入目录路径,就能轻松实现。

  • CreateMultipleDirectory:该方法用于创建文件,若文件夹不存在则依次创建。它通过_access函数检查目录是否存在,不存在则使用_mkdir函数创建。在需要保存文件到特定目录结构,但该目录结构可能不存在的情况下,调用UTIL_CreateMultipleDirectory方法,传入文件路径,就能确保目录被成功创建。比如在日志记录功能中,需要将日志文件保存到特定目录,就可以使用这个方法。

  • 关键函数

1
2
3
4
5
// 遍历此目录下所有文件名称
static void GetFileNames(std::string path, std::vector<std::string>& files);

// 创建文件,文件夹不存在则依次创建
static bool CreateMultipleDirectory(std::string FileName);

(二)日志记录:LogUtil 类

良好的日志记录是程序调试和维护的关键。LogUtil类以单例模式实现,具备强大的日志记录功能:

  • 日志等级:定义了DEBUG、INFO、WARN、ERRORS、FATAL共 5 个日志等级,可根据不同的业务场景记录不同级别的日志。在开发阶段,使用DEBUG等级记录详细的调试信息;在生产环境中,使用INFO、WARN等等级记录关键信息和警告信息。

  • 日志输出:log方法用于输出日志,它会在日志内容前添加时间戳、日志等级、文件名和行号,并且同时输出到控制台和指定文件中。例如,在程序运行过程中,出现错误时调用UTIL_INSTANCE_LogError方法,就能清晰地记录错误发生的时间、位置和具体信息。

  • 日志文件管理:支持日志文件的打开、关闭和轮转。当日志文件大小达到设定的最大值时,会将当前日志文件重命名备份,并创建新的日志文件继续记录日志,确保日志文件不会无限增大。

  • 关键函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define UTIL_INSTANCE_LogDebug(format,...) \
Logger::instance()->log(Logger::DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)

#define UTIL_INSTANCE_LogInfo(format,...) \
Logger::instance()->log(Logger::INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)

#define UTIL_INSTANCE_LogWarn(format,...) \
Logger::instance()->log(Logger::WARN, __FILE__, __LINE__, format, ##__VA_ARGS__)

#define UTIL_INSTANCE_LogError(format,...) \
Logger::instance()->log(Logger::ERRORS, __FILE__, __LINE__, format, ##__VA_ARGS__)

#define UTIL_INSTANCE_LogFatal(format,...) \
Logger::instance()->log(Logger::FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)

// 单例
static Logger* instance();

// 日志输出
void log(Level level, const char* file, int line, const char* format,...);

(三)程序启动管理:StartUtil 类

在多实例管理方面,StartUtil类的IsFirstStart方法发挥了重要作用。它通过创建指定名称的互斥量来判断程序是否首次启动。如果已有实例在运行,会记录错误日志,查找已运行程序的窗口并将其置于前端,同时弹出提示框告知用户软件已启动,请勿重复启动。这在确保程序同一时间只有一个实例运行的场景中非常实用,比如一些系统服务程序,不允许同时启动多个实例。

  • 关键函数
1
2
// 判断互斥量为${NAME}的程序是否第一次启动
static bool IsFirstStart(std::string Name);

(四)时间处理:TimeUtil 类

时间处理在很多应用场景中都至关重要。TimeUtil类同样采用单例模式,提供了丰富的时间处理功能:

  • GetCurrentTimeString:用于获取当前系统时间,并以指定格式返回字符串。在日志记录中,这个方法可以为日志添加准确的时间戳。

  • TimingStartsTimingEnds:分别用于开始计时和结束计时,通过QueryPerformanceCounter函数获取时间差,精确计算程序运行时间。在性能测试场景中,这两个方法可以帮助开发者评估某个模块或函数的执行效率。

  • 关键函数

1
2
3
4
5
6
7
8
9
10
11
// 单例
static TimeUtil* instance();

// 获取当前系统时间,返回 %d-%d-%d %d-%d-%d.%d 格式字符串
std::string GetCurrentTimeString();

// 开始计时
void TimingStarts();

// 计时结束,返回开始到结束的持续时间ms
double TimingEnds();

(五)配置读取:UtilDefineBasic 类

UtilDefineBasic类负责从配置文件中读取配置信息。它使用pugixml库解析 XML 格式的配置文件,提供了GetUtilCongfig方法的多个重载版本,能够读取int、std::string、double等不同类型的配置值。在实际项目中,程序的一些参数,如日志文件的最大大小、程序的启动参数等,都可以通过配置文件进行管理,方便在不修改代码的情况下进行调整。

  • 关键函数
1
2
3
4
5
6
static UtilDefineBasic* instance();

// 获取指定json文件中键为Key的value值
static bool GetUtilCongfig(std::string key, std::string &t);
static bool GetUtilCongfig(std::string key, int &t);
static bool GetUtilCongfig(std::string key, double &t);

(六)IP 地址验证:ValidUtil 类

在网络编程中,IP 地址验证是必不可少的环节。ValidUtil类的IsValidIp方法用于检查 IP 地址是否合法,并判断其是单播地址还是组播地址。它通过InetPton函数验证 IP 地址的格式,再根据地址的第一个字节判断地址类型。在网络连接模块中,这个方法可以确保用户输入的 IP 地址是有效的,避免因无效 IP 地址导致的连接失败问题。

  • 关键函数
1
2
// 检查ip是否合法,0:非法地址  1:单播地址 2:组播地址
static int IsValidIp(const std::string &ipaddress);

二、使用方法与集成

(一)引入类库

在你需要使用此工具类库的地方引入动态库Util.dll和头文件Util.h。如果使用CMake构建项目,在CMakeLists.txt文件中,通过set命令设置第三方库列表,如set(THIRD_LIBRARY_LIST boost pugixml),并使用include命令引入相关的构建脚本,如include(..//module_standard.cmake) ,完成类库的引入配置。

(二)调用函数

在代码中通过导入工具类库的头文件,就可以直接调用其中的函数。例如,在需要记录日志的地方,调用UTIL_INSTANCE_LogDebug、UTIL_INSTANCE_LogInfo等宏定义函数;在处理文件操作时,调用UTIL_CreateMultipleDirectory和UTIL_GetFileNames函数;在验证 IP 地址时,调用UTIL_IsValidIp函数。

三、工具类库的优势

(一)提高开发效率

这套工具类库将常用功能进行了封装,避免了重复编写代码,大大缩短了开发周期。开发者无需在每个项目中重新实现这些功能,直接调用工具类库中的方法即可,让开发工作更加高效快捷。

(二)降低出错率

经过多次测试和优化,工具类库中的代码稳定性和可靠性较高,减少了因重复编写代码可能出现的错误。而且,工具类库的统一管理也方便对代码进行维护和修复,降低了项目的维护成本。

(三)便于维护和扩展

如果某个功能需要修改或优化,只需在工具类库中修改一处,所有使用该功能的项目都会自动更新。同时,随着项目需求的不断变化,可以方便地在工具类库中添加新的功能,实现工具类库的持续扩展。

四、总结与展望

这套工具类库是我在开发过程中的经验积累和智慧结晶,它为解决开发中的常见问题提供了便捷的方案。在未来,我还计划进一步完善和扩展这个工具类库,比如增加网络请求封装、数据库操作封装等功能,使其能够更好地适应各种开发场景,为开发者提供更加强大的支持。希望这套工具类库也能为大家的开发工作带来便利,提高开发效率。如果大家在使用过程中有任何问题或建议,欢迎随时交流分享。

五、源码及动态库地址

Util源码:Github链接

Util 动态库下载:百度网盘下载 提取码: pe4u