Windows核心编程_LOG软件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bjbz_cxy/article/details/82149978

博主最近在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;
}

猜你喜欢

转载自blog.csdn.net/bjbz_cxy/article/details/82149978