Board logo

标题: C# 学习笔记 <委托>,遍历目录文件大小 过滤保存日志 [打印本页]

作者: Gin_Q    时间: 2021-3-3 19:22     标题: C# 学习笔记 <委托>,遍历目录文件大小 过滤保存日志

  1. using System;
  2. using System.Windows.Forms;
  3. using System.IO;
  4. using System.Collections.Generic;
  5. class DelegateExtension
  6. {
  7.     // 委托类型声明 返回值类型 string 类型名 MyDelegate 参数 digits 类型为 int
  8.     public delegate string MyDelegate(int digits);
  9.      
  10.     static void Main()
  11.     {
  12.         // Test test = new Test();
  13.          
  14.         // 自定义委托
  15.         // MyDelegate fu1 = new MyDelegate(test.fun1);
  16.         // MyDelegate fu2 = new MyDelegate(Test.fun2);
  17.         // MyDelegate fu1 = test.fun1;
  18.         // MyDelegate fu2 = Test.fun2;
  19.          
  20.         // 系统封装好的不带返回值委托类
  21.         // Action<string> fu3;
  22.         // fu3 = test.fun3;
  23.          
  24.         // 系统封装好的带返回值的委托类
  25.         // 方法返回值类型放在Func最后面
  26.         // Func<int, string> fu1 = test.fun1;
  27.         // Func<int, string> fu2 = Test.fun2;
  28.          
  29.         // Console.WriteLine(fu1(2));
  30.         // Console.WriteLine(fu2(20));
  31.         // fu3("GIN");
  32.          
  33.         string logPath = @"D:\GIN\c#\Exercise\log.log";
  34.         // 实例默认输出至logPath
  35.         FileLogger fileLogger = new FileLogger(logPath);
  36.          
  37.          
  38.         // Console.WriteLine("日志级别:{0}", Logger.LogLevel);
  39.         // Logger.LogMessage(Severity.Error, "Logger", "ERROR");
  40.         // Logger.LogMessage(Severity.Warning, "Logger", "Warning");
  41.         // 等级低于设置级别,不打印
  42.         // Logger.LogMessage(Severity.Information, "Logger", "Information");
  43.          
  44.         // 卸载LogPath.LogMessage, 将不会输出之文本
  45.         // fileLogger.DetachLog();
  46.         // Logger.LogLevel = Severity.Information;
  47.         // Console.WriteLine("日志级别:{0}", Logger.LogLevel);
  48.         // Logger.LogMessage(Severity.Information, "Logger", "Information");
  49.          
  50.         FileInformation target = new FileInformation(@"D:\");
  51.          
  52.         // 修改日志级别
  53.         Logger.LogLevel = Severity.Information;
  54.         Console.WriteLine("日志级别:{0}", Logger.LogLevel);
  55.          
  56.         // 不在控制台输出
  57.         // 从多播委托中卸载控制台输出
  58.         Logger.WriteMessage -= Console.WriteLine;
  59.          
  60.         // 扫描之前设置一下过滤文件的大小
  61.         // 文件小于 1M 的将被记录
  62.         target.filterFileSizeKB = 1024;
  63.         // 开始扫描
  64.         target.StartScan();
  65.          
  66.     }
  67.      
  68.     // logger 输出级别
  69.     public enum Severity
  70.     {
  71.         Verbose,
  72.         Trace,
  73.         Information,
  74.         Warning,
  75.         Error,
  76.         Critical
  77.     }
  78.      
  79.     // 日志输出
  80.     public static class Logger
  81.     {
  82.         // 静态类中也不能出现实例的字段成员
  83.         // 静态类的字段需要在编译前赋值, 不能在运行时赋值, 除了它的属性
  84.         // 消息处理处理委托,参数为 string
  85.          
  86.         // 默认输出至控制台
  87.         public static Action<string> writeMessage = Console.WriteLine;
  88.         public static Action<string> WriteMessage{get{return writeMessage;} set {writeMessage = value;}}
  89.          
  90.         // 日志输出等级设置
  91.         private static Severity logLevel = Severity.Warning;
  92.          
  93.         // 设置字段属性
  94.         public static Severity LogLevel{get{return logLevel;} set {logLevel = value;}}
  95.          
  96.          
  97.         // 判断输入日志是否满足日志输出等级 (需要三个参数)
  98.         public static void LogMessage(Severity s, string component, string msg)
  99.         {
  100.             // 设置日志级别小于 logLevel 级别跳过
  101.             if (s < logLevel)
  102.             {
  103.                 return;
  104.             }
  105.             
  106.             // 设置日志级别大于等于 Warning 将在控制台输出
  107.             // 这里有个 BUG 没有检查多播链中是否已经存在这个方法
  108.             if (s >= Severity.Warning)
  109.             {
  110.                 writeMessage += Console.WriteLine;
  111.                 writeMessage(String.Format("{0}\t{1}\t{2}", DateTime.Now, component, msg));
  112.                 writeMessage -= Console.WriteLine;
  113.                 return;
  114.             }
  115.             
  116.             // 调用日志输出方法
  117.             // String.Format 将返回一个字符串,传入 writeMessage 委托的方法
  118.             writeMessage(String.Format("{0}\t{1}\t{2}", DateTime.Now, component, msg));
  119.         }
  120.          
  121.     }
  122.      
  123.     // 输出日志到本地文件
  124.     public class FileLogger
  125.     {
  126.         private readonly string logPath;
  127.         public FileLogger(string path)
  128.         {
  129.             logPath = path;
  130.             // 加入 追加模式写入文本方法(多播委托)
  131.             Logger.WriteMessage += LogMessage;
  132.         }
  133.          
  134.         // 追加模式写入文本 utf-8
  135.         public void LogMessage(string msg)
  136.         {
  137.             try
  138.             {
  139.                 using (var log = File.AppendText(logPath))
  140.                 {
  141.                     log.WriteLine(String.Format("{0}", msg));
  142.                     log.Flush();
  143.                 }
  144.             }
  145.             catch
  146.             {
  147.                     Console.WriteLine("记录日志到 {0} 文件中失败!", logPath);
  148.             }
  149.         }
  150.          
  151.         // 卸载 LogMessage
  152.         public void DetachLog()
  153.         {
  154.             Logger.writeMessage -= LogMessage;
  155.         }
  156.     }
  157.      
  158.     // 文件信息扫描
  159.     public class FileInformation
  160.     {
  161.         // 扫描文件夹路径
  162.         public string TargetDirectory{get;set;}
  163.          
  164.         public FileInformation(string dir)
  165.         {
  166.             this.TargetDirectory = dir;
  167.         }
  168.          
  169.         // 这个可以设置成其他容量,需要转换
  170.         // 设置过滤文件大小
  171.         public float filterFileSizeKB = 0;
  172.         public float FilterFileSizeKB
  173.         {
  174.             get
  175.             {
  176.                 return filterFileSizeKB;
  177.             }
  178.             set
  179.             {
  180.                 this.filterFileSizeKB = value;
  181.             }
  182.         }
  183.          
  184.         // 指定不可访问的目录
  185.         public List<string> skipList = new List<string>{@"$RECYCLE.BIN", @"System Volume Information"};
  186.          
  187.         // value 的值是 List<string> 类型
  188.         public List<string> SkipList
  189.         {
  190.             get
  191.             {
  192.                 return this.skipList;
  193.             }
  194.             set
  195.             {
  196.                 // 这里可以检查一下列表里面是否已经存在
  197.                 foreach (var str in value)
  198.                 {
  199.                     // 不存在,则加入
  200.                     if (this.skipList.IndexOf(str) == -1)
  201.                         this.skipList.Add(str);
  202.                 }
  203.             }
  204.         }
  205.          
  206.         public bool StartScan()
  207.         {
  208.             DirectoryInfo dir;
  209.             // 处理报错
  210.             try
  211.             {
  212.                 dir = new DirectoryInfo(this.TargetDirectory);        
  213.                 decimal count = 0; // 文件计数
  214.                 bool flag = false;
  215.                 foreach (var each in dir.GetDirectories())
  216.                 {
  217.                     flag = false;
  218.                     // 查询是否包含不可访问目录
  219.                     foreach (var sikp in this.skipList)
  220.                     {
  221.                         if (each.FullName.Contains(sikp))
  222.                         {
  223.                             flag = true;
  224.                             // 开启记录日志
  225.                             Logger.LogMessage(Severity.Warning, "FileInformation", String.Format("{0}  跳过指定目录:{1}", DateTime.Now, each.FullName));
  226.                             break;
  227.                         }
  228.                     }
  229.                      
  230.                     if (flag) continue;
  231.                      
  232.                     DirectoryInfo eachDir = new DirectoryInfo(each.FullName);
  233.                     // 在搜索操作中包括当前目录和所有它的子目录。 此选项在搜索中包括重解析点,比如安装的驱动器和符号链接。
  234.                     foreach (System.IO.FileInfo fi in eachDir.GetFiles("*.*", System.IO.SearchOption.AllDirectories))
  235.                     {
  236.                         count++;
  237.                         // 这里只记录文件大小 小于 指定文件大小
  238.                         // 其他的还可以增加
  239.                         if (fi.Length < this.FilterFileSizeKB)
  240.                             // 开启记录日志
  241.                             Logger.LogMessage(Severity.Information, "FileInformation", String.Format("{0},{1},{2}",count, fi.FullName, fi.Length));
  242.                     }
  243.                 }
  244.             }
  245.             catch (Exception err)
  246.             {
  247.                 Logger.LogMessage(Severity.Error, "FileInformation", err.Message);
  248.                 return false;
  249.             }
  250.             // 暂且返回真
  251.             return true;
  252.         }
  253.          
  254.         // 加入日志
  255.         public void FromLog(FileLogger obj)
  256.         {
  257.             Logger.writeMessage += obj.LogMessage;
  258.         }
  259.          
  260.         // 移除日志
  261.         public void DetachLog(FileLogger obj)
  262.         {
  263.             Logger.writeMessage -= obj.LogMessage;
  264.         }
  265.     }
  266.      
  267.      
  268.     public class Test
  269.     {
  270.         public void fun3(string name)
  271.         {
  272.             MessageBox.Show(String.Format("Hello {0} !", name));
  273.         }
  274.          
  275.         public string fun1(int digits)
  276.         {
  277.             if (digits > 10)
  278.             {
  279.                 return String.Format("{0} > 10", digits);
  280.             }
  281.             else
  282.             {
  283.                 return String.Format("{0} < 10", digits);
  284.             }
  285.         }
  286.          
  287.         public static string fun2(int digits)
  288.         {
  289.             if (digits > 10)
  290.             {
  291.                 return "GEQ";
  292.             }
  293.             else
  294.             {
  295.                 return "LEQ";
  296.             }
  297.         }
  298.     }
  299. }
复制代码

作者: xczxczxcz    时间: 2021-3-3 19:34

从 52 跑到这来了?
作者: Gin_Q    时间: 2021-3-3 19:39

回复 2# xczxczxcz


    恩。。。很巧,你也在吾爱。
作者: xczxczxcz    时间: 2021-3-3 19:43

回复 3# Gin_Q


    我的 52 号不知什么原因不能用了,现在只是打打酱油
作者: Gin_Q    时间: 2021-3-3 19:46

回复 4# xczxczxcz


    违规了吧! 刚刚起步学编程,就是这里学批处理起步的。
作者: xczxczxcz    时间: 2021-3-3 19:53

回复 5# Gin_Q


    NO 偶是以前免费账号,一段时间没上过 52,后来要付费才能注册后,再去看时发现不能用了。偶也再没去注册了。现在偶最喜欢看的之家的评论区。以前在之家发了很多帖子,后要手机号登陆后也只打酱油了。
作者: xczxczxcz    时间: 2021-3-3 20:04

bat之家 经常打不开,找不到服务器。来的也少了。
作者: Gin_Q    时间: 2021-3-3 20:24

回复 7# xczxczxcz


   没办法,理解。不知道站长是不是用爱在发电!
作者: netdzb    时间: 2021-3-4 09:21

回复 1# Gin_Q

贴点西加加或者python的笔记吧,c#没怎么学过。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2