zoukankan      html  css  js  c++  java
  • 从java文件和CS文件里查询方法使用次数工具

    前几天,领导让我找一下老系统(Java)里getRemoteUser方法都哪个文件用了,package是什么,方法被调用了多少次,当时因为着急,所以,直接人工找的,但是以后要是再出现,人工找就太讨厌了,毕竟程序员以懒著称,因此,写了一个小工具进行查询。

    一、效果图

    从图中不难看出,现在的功能只能查询两类文件java和cs,毕竟是针对我们用的,如果想扩展的话,也是没有问题的,毕竟方法是通用的。

    最终得到的是一个excel

    二、开发过程

    1、首先建一个实体类

    实体类里面包含包名、文件名和使用次数

    class ContentEntity
        {
            private string _paOrns;
            private string _fileName;
            private int useCount;
            /// <summary>
            /// package或者是NameSpace
            /// </summary>
            public string PaOrns
            {
                get
                {
                    return _paOrns;
                }
    
                set
                {
                    _paOrns = value;
                }
            }
            /// <summary>
            /// 文件名
            /// </summary>
            public string FileName
            {
                get
                {
                    return _fileName;
                }
    
                set
                {
                    _fileName = value;
                }
            }
            /// <summary>
            /// 使用次数
            /// </summary>
            public int UseCount
            {
                get
                {
                    return useCount;
                }
    
                set
                {
                    useCount = value;
                }
            }
        }
    实体类

    2、截取字段

    因为要从Java文件里取出package后面的内容,CS文件里取出NameSpace后面的内容,因此需要用到截取字段,这个小工具的开发并没有用SubString来截取字段,而是用的正则表达式

    class Match
        {
            /// <summary>
            /// 获取java的package
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string GetPackage(string str)
            {
                return Regex.Match(str, "(?<=package).*?(?=;)").Value;
            }
            /// <summary>
            /// 获取C#的NameSpace
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string GetNamespace(string str)
            {
                return Regex.Match(str, "(?<=namespace).*?(?=
    )").Value;
            }
            /// <summary>
            /// 获取文件名
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string GetFileName(string str)
            {
                return Regex.Match(str, "(?<=_).*?(?=_)").Value;
            }
            /// <summary>
            /// 获取命名空间
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string GetPaOrNs(string str)
            {
                return Regex.Match(str, "^.*?(?=_)").Value;
            }
        }
    正则截取字段

    3、读取文件夹下文件

    循环遍历选择的文件夹路径下的所有文件

    /// <summary>
            /// 取得指定路径下所有目录及文件名称(可递归)
            /// </summary>
            /// <param name="strDir">指定路径</param>
            /// <param name="strFilePattern">要与 strDir 中的文件名匹配的搜索字符串
            /// “*.abc*”返回扩展名为 .abc、.abcd、.abcde、.abcdef 等的文件。
            /// “*.abcd”只返回扩展名为 .abcd 的文件。
            ///  “*.abcde”只返回扩展名为 .abcde 的文件。
            /// </param>
            /// <param name="arrDirs">查询得到的所有目录</param>
            /// <param name="arrFiles">查询得到的所有文件名称</param>
            /// <param name="bIsRecursive">是否递归查询</param>
            /// <returns></returns>
            private static List<string> GetFileList(string strDir, string strFilePattern, List<string> arrDirs, List<string> arrFiles, bool bIsRecursive)
            {
                DirectoryInfo dirInfo = new DirectoryInfo(strDir);
                if (string.IsNullOrEmpty(strDir))
                    return null;
    
                try
                {
                    //取得指定路径下的所有符合条件的文件
                    FileInfo[] strFiles = dirInfo.GetFiles(strFilePattern);
                    //取得指定路径下的所有目录
                    DirectoryInfo[] strDirs = dirInfo.GetDirectories();
    
                    foreach (FileInfo item in strFiles)
                    {//将所有文件名称加入arrFiles中
                        arrFiles.Add(item.FullName);
                    }
    
                    foreach (DirectoryInfo item in strDirs)
                    {//将所有目录名称加入arrDirs中
                        arrDirs.Add(item.FullName);
                    }
    
                    if (bIsRecursive)
                    {//递归
                        if (strDirs.Length > 0)
                        {
                            foreach (DirectoryInfo item in strDirs)
                            {//递归遍历所有文件夹
                                GetFileList(item.FullName, strFilePattern, arrDirs, arrFiles, bIsRecursive);
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                return arrFiles;
            }
    读取文件夹下的文件

    4、读取需要的文件

    读取java或cs文件,并判断里面是否存在要搜索的关键字

    /// <summary>
            /// 获取包含查询内容的集合
            /// </summary>
            /// <param name="path">路径</param>
            /// <param name="searchStr">要查询的内容</param>
            public static List<ContentEntity> GetInfoIncludeSearchStr(string path, string searchStr, string type)
            {
                List<ContentEntity> ceList = new List<ContentEntity>();
                ContentEntity ce;
    
                //获取查询内容的长度
                int strLength = searchStr.Length;
                //包含路径的所有集合
                List<string> AllFile = GetFileList(path, type, new List<string>(), new List<string>(), true);
                foreach (string item in AllFile)
                {
                    FileStream fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.None);
                    StreamReader sr = new StreamReader(fs);
                    //读取文件的内容
                    string strLine = sr.ReadToEnd();
                    if (strLine.Length >= strLength)
                    {
                        for (int i = 0; i < strLine.Length - strLength; i++)
                        {
                            //判断是否包含查询的内容
                            if (strLine.Substring(i, strLength).Equals(searchStr))
                            {
                                ce = new ContentEntity()
                                {
                                    PaOrns = type == FileType.type_Java ? Match.GetPackage(strLine) : Match.GetNamespace(strLine),//判断是哪种类型,选择不同的处理方式
                                    FileName = Path.GetFileName(item),
                                    UseCount = 1
                                };
                                ceList.Add(ce);
                            }
                        }
                    }
                    //关闭
                    sr.Close();
                    fs.Close();
                }
                return ceList;
            }
    查询关键字

    5、导出到excel

    将最终得到的结果导出到excel,并打开excel

    public static void ExportExcel(System.Data.DataTable dt)
            {
                if (dt == null || dt.Rows.Count == 0)
                    return;
                Application xlApp = new Application();
                if (xlApp == null)
                    return;
                CultureInfo CurrentCI = Thread.CurrentThread.CurrentCulture;
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                Workbooks workbooks = xlApp.Workbooks;
                Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                Worksheet worksheet = workbook.Worksheets[1];
                Range range;
                long totalCount = dt.Rows.Count;
                long rowRead = 0;
                long percent = 0;
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                    range = worksheet.Cells[1, i + 1];
                    range.Interior.ColorIndex = 15;
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        try
                        {
                            worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString();
                        }
                        catch 
                        {
                            worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString().Replace("=", "");
                        }
                    }
                    rowRead++;
                    percent = (100 * rowRead) / totalCount;
                }
                worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
                worksheet.Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, " ", "Red", 15, MsoTriState.msoFalse, MsoTriState.msoTrue, 150, 200);
                xlApp.Visible = true;
            }
    导出excel

    工具下载

  • 相关阅读:
    36、基于TCP、UDP协议的嵌套字通信
    34、异常以及网络编程
    作业4月15号
    31、反射与内置方法、元类
    30、多态与鸭子类型以及内置函数
    作业4月9号
    29、继承
    作业4月8号
    28、封装
    27、面向对象
  • 原文地址:https://www.cnblogs.com/ZXdeveloper/p/5682230.html
Copyright © 2011-2022 走看看