博主最近在EasyEXPERT软件上编写GPIB程序,因为要用到LOG来生成日志,但是EasyEXPERT很明显没有提供这样的方法但提供了command来加载外部程序传参运行参数,所以可以使用这个方法来编写外部运行程序来获取运行参数,然后写log,这里为了方便以后可能有人会用到,源代码就发出来吧!
格式为:
Log软件在生成的时候会读取当前目录下的path配置文件获取log的路径,然后log会以年-天为单位生成log日志,并且每次写log都会检测用户log文件是否大于10MB,如果大于的话会提示用户是否需要清空所有log文件,如果要求清除则备份,并且仅每天提示一次:
/*
LOG
周志豪
2018.8.5.16:02
*/
#include<stdio.h>
#include <windows.h>
#include "time.h"
#include <direct.h> //GETCWD,LINUX:unistd.h
//获取年
char *GetYear() {
time_t t = time(0);
char tmp[256] = {0};
strftime(tmp, sizeof(tmp), "%Y", localtime(&t));
return tmp;
}
//获取月
char *GetMon() {
time_t t = time(0);
char tmp[256] = { 0 };
strftime(tmp, sizeof(tmp), "%m", localtime(&t));
return tmp;
}
//获取月号
char *GetMonth() {
time_t t = time(0);
char tmp[256] = { 0 };
strftime(tmp, sizeof(tmp), "%m.%d", localtime(&t));
return tmp;
}
//获取时间
char *GetTime() {
time_t t = time(0);
char tmp[256] = { 0 };
strftime(tmp, sizeof(tmp), "%X", localtime(&t));
return tmp;
}
//判断文件夹是否存在
int GetFileAttr(char *FileName) {
if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(FileName)) {
return 0;
}
else {
return 1;
}
}
//打开文件,拼接方式
FILE *OpenFile(char *FileName) {
//判断文件名参数是否正确
if (FileName == NULL) {
return NULL;
}
//判断文件是否存在
FILE *fp = NULL;
fp = fopen(FileName, "r");
//文件不存在
if (fp == NULL) {
//创建文件
fp = fopen(FileName, "w");
return fp;
}
else { //拼接的方式
fclose(fp);
fp = fopen(FileName, "a");
fseek(fp, 10, SEEK_SET);
//将文件流指针返回
return fp;
}
return NULL;
}
//创建文件夹
int CreateFileAttr(char *FileName) {
if (0 == CreateDirectory(FileName, NULL)) {
return 0;
}
else {
return 1;
}
}
//动态判断字符数组长度
int GetStrArrSize(char *Arr) {
if (Arr == NULL) {
return -1;
}
int size = 0;
while (1) {
if (Arr[size++] == '\0') {
break;
}
}
return size;
}
//字符串剔除函数_后
char* DeleteStr(char* Arr, char str) {
//判断字符长度
int size = GetStrArrSize(Arr);
int i = size;
for (;i>0; --i) {
if (Arr[i] != str) {
Arr[i] = 0;
}
else {
return Arr;
}
}
}
//字符串剔除函数_前
char* DeleteStr_A(char* Arr, char str) {
//判断字符长度
int size = GetStrArrSize(Arr);
int i = 0;
for (; i<size; ++i) {
if (Arr[i] == str) {
Arr[i+1] = 0;
}
else {
return Arr;
}
}
}
//获取文件夹大小
unsigned long long GetFileAttrSize(char* path)
{
unsigned long long FileSize = 0;
//开始遍历目录:
WIN32_FIND_DATA FindData; //目录数据
HANDLE hError; //搜索句柄
char c_path[256] = { 0 };
strcpy(c_path, path);
strcat(c_path, "\\*"); //正则表达式
hError = FindFirstFile(c_path, &FindData); //建立搜索句柄
if (hError == INVALID_HANDLE_VALUE) //判断是否建立成功
{
return -2;
}
do
{
char str[256] = { 0 }; //路径
//如果是文件夹则重新建立搜索句柄
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindData.cFileName[0] != '.') {
sprintf(str, "%s\\%s", path, FindData.cFileName);//合并路径
GetFileAttrSize(str);//传递新的文件路径
}
}
else {
//开始计算文件总大小
FileSize += ((ULONG64)FindData.nFileSizeHigh & 0xffffffff) << 32 | (ULONG64)FindData.nFileSizeLow; //文件高低拼接
}
} while (FindNextFile(hError, &FindData)); //下一个文件夹
return FileSize; //返回文件大小
}
//获取当前路径,直接获取
char* GetPath() {
char path[256] = { 0 }; //Windows规定路径最多不能超过256个字节
_getcwd(path, 256);
return path;
}
//获取当前路径,以运行参数方式获取
char* GetExePath(char* argv1) {
//指定路径
char *_argv = (char*)malloc(GetStrArrSize(argv1));
strcpy(_argv, argv1);
_argv = DeleteStr(_argv, '\\');
return _argv;
}
//写日志
int main(int argc,char** argv) {
//写日志
//获取当前路径,一旦被作为子进程调用,进程环境路径会被变更到父进程上!
//指定路径
char *_argv = GetExePath(argv[0]);
//获取日志路径
char conf_path[256] = { 0 };
strcpy(conf_path, _argv);
//增加路径分割符
strcat(conf_path, "path.txt");
FILE *fp = fopen(conf_path,"r");
char path[256] = { 0 };
if (fp != NULL) {
fread(path, sizeof(path), 1, fp);
}
//判断文件夹是否存在
if (0 == GetFileAttr(path)) {
//创建文件夹
CreateFileAttr(path);
}
//获取日志文件夹大小
if (GetFileAttrSize(path) > (unsigned long long)0xA00000) { //10MB
//判断今日是否已经提示过用户清理日志文件
//判断日期
char read_path[256] = { 0 };
strcpy(read_path, path);
strcat(read_path, "s.txt");
char read_str[256] = { 0 };
FILE *r_fp = fopen(read_path, "r");
fread(read_str, 256, 1, fp);
if (strcmp(read_str, GetMonth()) == 0) {
NULL; //空指令无需弹出信息框
}
else {
//警告用户
if (MessageBox(NULL, "您的日志文件已经超出10MB是否需要程序帮您清理,还是稍后您手动清理?\n程序帮您清理的话,会备份一份,然后删除所有日志文件!", "警告", MB_YESNO) == IDYES) {
char _path[256] = { 0 };
strcpy(_path, path);
//备份文件夹
DeleteStr(_path, '\\');//得到日志路径
//获取年月日备份
char _Attr[256] = { 0 };
strcpy(_Attr, "备份~");
strcat(_Attr, GetYear()); //年
//创建文件夹
CreateFileAttr(_Attr);
//文件夹复制
CopyFile(path, _Attr, TRUE); //COPY
//删除文件夹
RemoveDirectory(path);
}
else { //创建日期标识文件
char n_path[256] = { 0 };
strcpy(n_path, path);
strcat(n_path, "s.txt");
FILE *fp = fopen(n_path, "w");
fwrite(GetMonth(), sizeof(GetMonth()), 1, fp);
}
}
}
//获取年
char *Year = GetYear();
if (Year == NULL) {
return -1;
}
//路径粘合
//添加路径分割符
if (strcmp(path, "") != 0) { //判断是否设置log路径
strcat(path, "\\");
}
strcat(path, Year);
strcat(path, "YEAR");
//判断"年"文件是否存在
if (0 == GetFileAttr(path)) {
//创建"年"文件夹
CreateFileAttr(path);
}
//获取“月”
char *Mon = GetMon();
if (Mon == NULL) {
return -1;
}
//路径粘合
strcat(path, "\\");
strcat(path, Mon);
strcat(path, "MONTH");
//判断"月"文件夹是否存在
if (0 == GetFileAttr(path)) {
//创建"月"文件夹
CreateFileAttr(path);
}
//获取“月号”
char *Month = GetMonth();
if (Month == NULL) {
return -1;
}
//路径粘合
//添加路径分隔符
strcat(path, "\\");
strcat(path, Month);
strcat(path, "NUMBER");
//判断这个“月”的文件夹是否存在
if (0 == GetFileAttr(path)) {
//创建"月号"文件夹
CreateFileAttr(path);
}
//写log
//完整绝对路径粘合
//路径分割符
strcat(path, "\\");
strcat(path, "LOG.txt");
FILE* FLOG = OpenFile(path);
if (FLOG == NULL) {
return -1;
}
//格式订正
char *data = (char*)malloc(GetStrArrSize(argv[1])+100);
memset(data, 0, GetStrArrSize(argv[1]) + 100);
sprintf(data, "[%s]\n%s\n", GetTime(), argv[1]);
fwrite(data, GetStrArrSize(data), 1, FLOG);
//添加\n,防止附加到第一行上,导致字符数据发生变更!
return 0;
}