为C# Console应用化个妆

说到Windows的cmd,刻板印象就是黑底白字的命令行界面。跟Linux花花绿绿的界面比,似乎单调了许多。但其实C#开发的Console应用也可以摆脱单调非黑即白的UI。

最近遇到个需求,要在一堆纯文本文件里找指定的关键字(后续还要人肉判断上下文)。当然Windows自带的搜索功能就可以,但还是想进一步提高直观性,在一个界面里先行预览。实现这个需求非常简单,总体思路就是用DirectoryInfo和FileInfo(需要using System.IO)搜索指定目录下特定后缀的文本文件,然后File.ReadAllLine获取文件内容,再逐行分析有没有指定的关键字,有就输出文件名、行号、当前行的完整内容。从方便用户的角度,关键字高亮是个好特性,所以就引出了Console应用的化妆问题。好在实现起来超级简单,只需要在适当的位置使用Console.ForegroundColor以及Console.BackgroundColor即可。实现高亮功能的核心示例代码如下:

cs 复制代码
        /// <summary>
        /// 设置控制台颜色
        /// </summary>
        /// <param name="fc">前景色</param>
        /// <param name="bc">背景色</param>
        static void SetColor(ConsoleColor fc, ConsoleColor bc)
        {
            Console.ForegroundColor = fc;
            Console.BackgroundColor = bc;
        }



        /// <summary>
        /// 设置控制台默认颜色
        /// </summary>
        static void SetDefaultColor()
        {
            // 前景灰白色, 背景黑色
            SetColor(ConsoleColor.Gray, ConsoleColor.Black);
        }



        /// <summary>
        /// 控制台应用中高亮显示关键字
        /// </summary>
        /// <param name="text">文本全文</param>
        /// <param name="keyword">关键字</param>
        /// <param name="fc">前景色</param>
        /// <param name="bc">背景色</param>
        static void ConsoleShow(string text, string keyword, ConsoleColor fc, ConsoleColor bc)
        {
            //string[] parts = text.Split(new string []{ keyword },StringSplitOptions.None);
            string[] parts = Regex.Split(text, keyword, RegexOptions.IgnoreCase);
            for (int i = 0; i < parts.Length - 1; i++)
            {
                SetDefaultColor();
                Console.Write(parts[i]);
                SetColor(fc, bc);
                Console.Write(keyword.Trim());
            }

            SetDefaultColor();
            Console.Write(parts[parts.Length - 1]);
            Console.WriteLine();

        }

实现高亮的核心思路是以关键字为分隔符做字符串拆分,分隔符前的文字用默认颜色展示,分隔符本身用高亮颜色展示,分隔符后的再用默认。上面的代码只是示例性的,细节上还有点小bug。

演示效果如下:

相关推荐
小徐不徐说7 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang7 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3277 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102168 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷8 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang8 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj5209 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵11 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy111 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++