⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trace.cs

📁 简单项目管理系统源码 该源码为某公司的项目管理系统Demo版
💻 CS
字号:
using System;  
using System.IO;
using System.Threading;

namespace projmanager
{
	//该源码下载自www.51aspx.com(51aspx.com)

	/// <summary>
	/// Trace 的摘要说明。
	/// </summary>
	public class Trace
	{
		private static TextWriter m_C=null;

		private static string file_path=null;
		private static string m_dir=null;
		private static string m_file=null;

		public static string FilePath
		{
			get
			{
				return file_path;
			}
			set
			{

				file_path=value;
				m_dir=Path.GetDirectoryName(file_path);
				m_file=Path.GetFileName(file_path);

				//如果未给定路径,取当前路径
				if(m_dir==""|| m_dir == null)        
				{
					m_dir=".";
				}
				//如果给定路径不是logs结尾,加logs
				if(!m_dir.EndsWith("logs"))         
				{
					m_dir+="\\logs";
				}
				//如果未给定文件名,默认为Trace.log
				if(m_file == "")             
				{
					m_file = "Trace.log" ;
				}
				//文件扩展名,默认为.log
				if(!m_file.EndsWith(".log"))
				{
					m_file += ".log" ;
				}

				try
				{
					Directory.CreateDirectory(m_dir);
				}
				catch{}
			}
		}

		/// <summary>
		/// 若需要往控制台输出,调用方需给出TextWriter
		/// </summary>
		public static TextWriter OutputConsole
		{
			get
			{
				TextWriter tw=null;

				lock(typeof(Trace))
				{
					tw=m_C;
				}
				return tw;
			}
			set
			{
				lock(typeof(Trace))
				{
					m_C=value;
				}
			}
		}
		
		/// <summary>
		/// 格式化待写的信息
		/// </summary>
		/// <param name="location">程序位置</param>
		/// <param name="type">日志类型(信息、错误等)</param>
		/// <param name="msg">日志内容</param>
		/// <returns>返回StringWriter</returns>
		private static StringWriter BuildMessage(string location, string type,string msg)
		{
			StringWriter sw=new StringWriter();

			//给日志信息加时间,不带日期,带毫秒
			sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;

			//将格式化的信息写入StringWriter
			sw.Write("[" + location + "]" + "<" + type + ">" + ": " + msg + "\n");

			return sw;
		}

		/// <summary>
		/// 给调用方已格式化的信息加时间
		/// </summary>
		/// <param name="format">调用方给出的格式</param>
		/// <param name="p">日志内容</param>
		/// <returns>返回StringWriter</returns>
		private static StringWriter BuildMessage(string format, params object[] p)
		{
			StringWriter sw=new StringWriter();
			
			//给日志信息加时间,不带日期,带毫秒
			sw.Write("<{0}>",DateTime.Now.ToString("HH:mm:ss:fff")) ;

			//将信息写入StringWriter
			sw.Write(format,p);
			return sw;
		}
		
		/// <summary>
		/// 在给出的Log文件名中,插入日期
		/// </summary>
		/// <returns></returns>
		private static string LogName()
		{
			StringWriter sw=new StringWriter();

			//将log文件名称和扩展名分开
			char []sp = {'.'} ;
			string []name = m_file.Split(sp) ;

			//在文件名称后面加日期后,再加上扩展名
			sw.Write("{0}_{1}.{2}",
				name[0],
				DateTime.Now.ToString("yyyyMMdd"),
				name[1]);

			return sw.ToString();
		}

		
		/// <summary>
		/// 为待归档文件产生节点数
		/// </summary>
		/// <param name="file_name">文件名</param>
		/// <returns>节点数</returns>
		private static int GetArchiveFileNode(string file_name)
		{
			int node=0;
			StringWriter pattern=new StringWriter();


			//在文件名称和扩展名之间加入_*作为搜索模式
			char []sp = {'.'} ;
			string []name = m_file.Split(sp) ;
			pattern.Write("{0}_*.{1}",name[0],name[1]);

			//在日志目录中查找所有符合上述模式的文件
			string[] files=Directory.GetFiles(
				m_dir,
				pattern.ToString());

			//为这些文件确定归档的节点
			foreach(string f in files)
			{
				int pos=f.LastIndexOf(".");
				string n=f.Substring(pos+1);
				
				try
				{
					int nn=int.Parse(n);
					if(nn>=node) node=nn+1;
				}
				catch{}
			}
			
			return node;

		}

		
		/// <summary>
		/// 归档:文件超过10M后
		/// </summary>
		/// <param name="fname">产生的归档文件名</param>
		private static void ArchiveThisFile(string fname)
		{
			//为待归档文件产生节点数
			int node=GetArchiveFileNode(fname);

			//分离文件名
			char []sp = {'.'} ;
			string []name = fname.Split(sp) ;
            			
			while(true)
			{

				//将节点数插入到文件名中间,作为待归档的文件名
				string a_path=m_dir+"\\"+name[0]+"_"+node.ToString() + "." + name[1];
				string s_path=m_dir+"\\"+fname;
				try
				{
					//归档
					File.Move(s_path,a_path);
					break;
				}
				catch{node+=1;}
			}
		}
		
		/// <summary>
		/// 写日志
		/// </summary>
		/// <param name="location">日志位置</param>
		/// <param name="type">日志类型</param>
		/// <param name="msg">信息</param>
		public static void Write(string location, string type,string msg)
		{
			//若文件名为空
			if(file_path==null||
				file_path=="") return ;

			StringWriter sw=null;

			lock(typeof(Trace))
			{
				string	lfile=LogName();
				long	lsize=0;
				string  path=m_dir+"\\"+lfile;

				//定义FileStream,可写入,在文件尾追加记录
				FileStream fs=new FileStream
					(
					path,
					FileMode.Append,
					FileAccess.Write,
					FileShare.ReadWrite
					);

				//实例一个StreamWriter
				StreamWriter fsw=new StreamWriter(fs);

				if(sw==null)
				{
					//格式化待写的信息
					sw=BuildMessage(location,type,msg);
				}

				//将字符串写到StreamWriter
				fsw.Write(sw.ToString());
				//获取文件大小
				lsize=fs.Length;
				//关闭StreamWriter和FileStream
				fsw.Close();
				fs.Close();

				if(lsize>1024*1024*10)
				{
					//文件超过10M后,归档
					ArchiveThisFile(lfile);					
				}

				//如果需要输出到控制台
				if(m_C!=null)
				{
					if(sw==null)
					{
						//格式化待写的信息
						sw=BuildMessage(location,type,msg);
					}

					//往控制台写信息
					m_C.Write(sw.ToString());
				}
			}
		}

		/// <summary>
		/// 写日志
		/// </summary>
		/// <param name="format">日志格式</param>
		/// <param name="p">日志内容</param>
		public static void Write(string format, params object[] p)
		{
			//若文件名为空
			if(file_path==null||
				file_path=="") return ;
			StringWriter sw=null;

			lock(typeof(Trace))
			{
				string	lfile=LogName();
				long	lsize=0;
				string  path=m_dir+"\\"+lfile;

				//定义FileStream,可写入,在文件尾追加记录
				FileStream fs=new FileStream
					(
					path,
					FileMode.Append,
					FileAccess.Write,
					FileShare.ReadWrite
					);

				//实例一个StreamWriter
				StreamWriter fsw=new StreamWriter(fs);

				if(sw==null)
				{
					//格式化待写的信息
					sw=BuildMessage(format,p);
				}

				//将字符串写到StreamWriter
				fsw.Write(sw.ToString());
				//获取文件大小
				lsize=fs.Length;
				//关闭StreamWriter和FileStream
				fsw.Close();
				fs.Close();

				if(lsize>1024*1024*10)
				{
					//文件超过10M后,归档
					ArchiveThisFile(lfile);					
				}

				//如果需要输出到控制台
				if(m_C!=null)
				{
					if(sw==null)
					{
						//格式化待写的信息
						sw=BuildMessage(format,p);
					}

					//往控制台写信息
					m_C.Write(sw.ToString());
				}
			}
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -