C++输出log日志到指定路径下且达到一定大小新建文件

HANDLE					g_TraceFileHandle = INVALID_HANDLE_VALUE;//必须为成员变量或者为全局变量
std::wstring			g_TraceFilePath;						//输出路径,必须为成员变量或者为全局变量
void CChannel::XDBDebugOnly(const wchar_t* pwszFormat,...)
{
	//XDBAutoSpinLock AutoLock(_xdbTraceLock);//锁
	if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
	{
		// 获得程序运行目录
		if( g_TraceFilePath.empty() )
		{
			//可以设置为获取进程所在路径
			WCHAR szAppPath[256] = { 0 } ;
// 			if( GetModuleFileNameW(NULL,szAppPath,256 )  == 0 )
// 				return;
// 
// 			// 构造合适的文件名
// 			LPWSTR pwszDot = wcsrchr( szAppPath, L'.' );
// 			pwszDot = 
// 			if( pwszDot != NULL )
// 				wcscpy( pwszDot, L".log" );
// 			else
// 				wcscat( szAppPath , L".log" );
// 
//  			LPWSTR pwszDir = wcsrchr(szAppPath, L'\\');
//  			CString strTmp = pwszDir;
// 			wcscpy( pwszDir, L"\\Log");
// 			wcscat(szAppPath, strTmp);

			wcscpy(szAppPath,L"C:\\WY.log");
			// 保存文件名
			g_TraceFilePath = szAppPath;
		}

		// 打开文件
		g_TraceFileHandle= CreateFileW( 
			g_TraceFilePath.c_str() , 
			GENERIC_WRITE , 
			FILE_SHARE_READ | FILE_SHARE_WRITE, 
			NULL , 
			OPEN_ALWAYS, 
			FILE_ATTRIBUTE_NORMAL,
			NULL );
		if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
			return;
	}

	//==============================================================================
	// 检查文件大小
	//==============================================================================
	if( GetFileSize( g_TraceFileHandle,NULL ) >= /*MAX_WY_FILE_SIZE单个文件的最大4M*/ ( 4*1024*1024 ))
	{
		// 关闭文件
		CloseHandle( g_TraceFileHandle );

		// 需要备份文件
		wostringstream OldName;
		OldName << g_TraceFilePath << WSTR(".") << /*MAX_WY_FILE_NUM最大生成文件个数*/32 << ends;
		::_wremove( OldName.str().c_str());

		// 文件改名
		size_t n = g_TraceFilePath.length()+1;
		for( long Index = /*MAX_WY_FILE_NUM最大生成文件个数*/32; Index >1; Index-- )
		{
			wstring NewName = OldName.str();
			OldName.seekp( ( wostringstream::off_type )n,std::ios::beg );
			OldName << Index-1 << ends;
			::_wrename( OldName.str().c_str(),NewName.c_str() );
		}
		::_wrename( g_TraceFilePath.c_str(),OldName.str().c_str() );

		// 重新创建文件
		g_TraceFileHandle= CreateFileW( 
			g_TraceFilePath.c_str() , 
			GENERIC_WRITE , 
			FILE_SHARE_READ | FILE_SHARE_WRITE, 
			NULL , 
			OPEN_ALWAYS, 
			FILE_ATTRIBUTE_NORMAL,
			NULL );
		if( g_TraceFileHandle == INVALID_HANDLE_VALUE )
			return;
	}

	// 再次检查文件大小
	if( GetFileSize( g_TraceFileHandle,NULL ) == 0 )
	{
		DWORD Bytes = 0;
		::WriteFile( g_TraceFileHandle,/*UNICODE_BOM*/"\xFF\xFE",2,&Bytes,NULL );	
	}

	// 设置文件位置
	SetFilePointer( g_TraceFileHandle , 0L , NULL , FILE_END );

	// 记录时间
	WCHAR	   szBuffer[/*MAX_WY_BUFFER*/1024] = { 0 };//MAX_WY_BUFFER 缓冲区大小
	SYSTEMTIME localTime		= { 0 };
	GetLocalTime( &localTime );
	swprintf( szBuffer ,/*MAX_WY_BUFFER*/1024, L"[%05d-%05d] %4d-%02d-%02d %02d:%02d:%02d:%03d : ", GetCurrentProcessId(),GetCurrentThreadId(), localTime.wYear , localTime.wMonth , localTime.wDay , localTime.wHour , localTime.wMinute, localTime.wSecond, localTime.wMilliseconds );

	// 格式化字符串
	size_t Len = wcslen( szBuffer );
	va_list args;
	va_start(args, pwszFormat);
	_vsnwprintf( szBuffer+Len , /*MAX_WY_BUFFER*/1024-Len-3, pwszFormat, args);
	va_end(args);
	Len = wcslen( szBuffer );
	szBuffer[Len]   = L'\r';
	szBuffer[Len+1] = L'\n';
	szBuffer[Len+2] = L'\0';

	// 输出日志到文件
	DWORD dwBytesWritten = 0;
	WriteFile( g_TraceFileHandle , szBuffer , (DWORD)wcslen( szBuffer )*sizeof(WCHAR) , &dwBytesWritten , NULL );

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。   Bootcfg   bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。   含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。   用法:   bootcfg /default  设置默认引导项。   bootcfg /add    向引导列表中添加 Windows 安装。   bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。   注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。   bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。   注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。   bootcfg /list   列出引导列表中已有的条目。   bootcfg /disableredirect 在启动引导程序中禁用重定向。   bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]   在启动引导程序中通过指定配置启用重定向。   范例: bootcfg /redirect com1 115200 bootcfg /redirect useBiosSettings   hkdsk   创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。   含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。   vol [drive:] [ chkdsk [drive:] [/p] [/r]   参数  无   如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。   注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart   创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。   diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]   参数 无   如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。   /add   创建新的分区。   /delete   删除现有分区。   device_name   要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:   DeviceHardDisk0   drive_name   以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:   D:   partition_name   以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:   DeviceHardDisk0Partition1    大小   要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。   范例   下例将删除分区: diskpart /delete Device HardDisk0 Partition3 diskpart /delete F:   下例将在硬盘上添加一个 20 MB 的分区:   diskpart /add Device HardDisk0 20   Fixboot

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值