文件生成时间耗时检测

85 篇文章 4 订阅

原理是根据修改时间减去创建时间,关联部分其他头文件,仅供参考。

bool GenerateTimeCheck(const _tstring& strFilePath, SYSTEMTIME& sElapsedTime)
{
	if (!CStdFile::IfAccessFile(strFilePath))
	{
		return false;
	}

	FILETIME ftCreate, ftAccess, ftWrite;
	SYSTEMTIME stUTC1, stLocal1, stUTC2, stLocal2, stUTC3, stLocal3;

	// -------->获取 FileTime
	HANDLE hSrcFile = CreateFile(strFilePath.c_str(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hSrcFile == INVALID_HANDLE_VALUE || !GetFileTime(hSrcFile, &ftCreate, &ftAccess, &ftWrite))
	{
		//error("GetFileTime()");
		return false;
	}

	//---------> 转换: FileTime --> LocalTime
	FileTimeToSystemTime(&ftCreate, &stUTC1);
	//FileTimeToSystemTime(&ftAccess, &stUTC2);
	FileTimeToSystemTime(&ftWrite, &stUTC3);

	SystemTimeToTzSpecificLocalTime(NULL, &stUTC1, &stLocal1);
	//SystemTimeToTzSpecificLocalTime(NULL, &stUTC2, &stLocal2);
	SystemTimeToTzSpecificLocalTime(NULL, &stUTC3, &stLocal3);

	//sElapsedTime = stLocal2 - stLocal1;

	if (stLocal3.wYear != stLocal1.wYear || stLocal3.wMonth != stLocal1.wMonth)
	{
		//一般月和年应当相同,不同则认为有问题(比如被修改过)
		return false;
	}

	//stLocal2临时变量
	stLocal2 = stLocal3;
	//手动处理,先全部借位
	stLocal2.wDay -= 1;
	stLocal2.wHour += 24 - 1;
	stLocal2.wMinute += 60 -1;
	stLocal2.wSecond += 60 -1;
	stLocal2.wMilliseconds += 1000;

	int nDay = (int)stLocal2.wDay - stLocal1.wDay;
	int nHour = (int)stLocal2.wHour - stLocal1.wHour;
	int nMin = (int)stLocal2.wMinute - stLocal1.wMinute;
	int nSecond = (int)stLocal2.wSecond - stLocal1.wSecond;
	int nMiliseconds = (int)stLocal2.wMilliseconds - stLocal1.wMilliseconds;

	//还原
	if (nMiliseconds >= 1000)
	{
		nMiliseconds -= 1000;
		nSecond += 1;
	}

	if (nSecond >= 60)
	{
		nSecond -= 60;
		nMin += 1;
	}

	if (nMin >= 60)
	{
		nMin -= 60;
		nHour += 1;
	}

	if (nHour >= 24)
	{
		nHour-= 24;
		nDay += 1;
	}

	sElapsedTime.wYear = 0;
	sElapsedTime.wMonth = 0;

	if (nDay < 0)
	{
		return false;
	}

	sElapsedTime.wDay = nDay;
	sElapsedTime.wHour = nHour;
	sElapsedTime.wMinute = nMin;
	sElapsedTime.wSecond = nSecond;
	sElapsedTime.wMilliseconds = nMiliseconds;

	return true;
}

更多的交流,欢迎留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值