最近正好需要统计下某项目代码行数,然后就找代码行数统计工具。以前找到过一个正则表达式,但是只有在VS2010下有用,VS2012和VS2013下的统计就不好使了。

接着搜索了一下代码行数统计绿色工具免费版,看到花花绿绿的浮动窗口和卧虎藏龙的下载链接,感觉非常令人生厌,而且,有些国产软件下载总是让你一不小心就中毒,所以最后还是放弃了下载。

当然,你知道,这点简单小功能,对于已经习惯自己搬砖搞定一切的码农,实在没有必要再费时间搜来搜去,而且那首歌唱得好,“Let it go,let it go...The code doesn‘t bother me anyway.”,所谓求人不如求己是也。

抽空自己写了这个代码行数分析winform工具,目前测试通过支持的语言有C#、Java、SQL、JavaScript和Python,共享出来,希望对你有帮助。

软件界面:

一、程序简单分析

统计分析代码行数,需要分析源文件。这里的程序选择简单的打开源文件的方法,但是读取内容不是一下子全部读完,而是一行一行读取,读取后,需要按统计条件分析并计数。

统计条件抽象如下:

using System;namespace PowerCodeCalculator.Model
{/// <summary>/// 代码统计条件/// </summary>
    [Serializable]public sealed class CodeStatisticCondition{/// <summary>/// 代码目录 绝对路径 形如:D:\PowerCode/// </summary>public string CodeDirectory { get; set; }/// <summary>/// 统计的代码类型 通常为.cs代码文件/// </summary>public string FileTypeFilter { get; set; }/// <summary>/// 忽略统计的代码文件 如VS自动生成的.designer.cs文件等 多个以逗号,分隔/// </summary>public string IgnoreFileType { get; set; }/// <summary>/// 是否统计大括号{或}/// </summary>public bool IsCalcBrace { get; set; }/// <summary>/// 是否统计空行行数/// </summary>public bool IsCalcEmptyLine { get; set; }/// <summary>/// 是否统计注释行数/// </summary>public bool IsCalcComment { get; set; }/// <summary>/// 是否启用多线程统计/// </summary>public bool IsEnableMultiThread { get; set; }}
}

CodeStatisticCondition

代码源文件信息CodeInfo抽象如下:

using System;namespace PowerCodeCalculator.Model
{/// <summary>/// 代码信息实体/// </summary>
    [Serializable]public sealed class CodeInfo{/// <summary>/// 文件名绝对路径 形如:c:\Program.cs/// </summary>public String FilePath { get; set; }/// <summary>/// 代码行数/// </summary>public Int64 LineCount { get; set; }/// <summary>/// 代码字符数/// </summary>public Int64 CharCount { get; set; }}
}

CodeInfo

返回的源文件统计信息CodeStatisticInfo抽象如下:

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;namespace PowerCodeCalculator.Model
{/// <summary>/// 代码统计结果信息实体/// </summary>
    [Serializable]public sealed class CodeStatisticInfo{/// <summary>/// 是否成功/// </summary>public bool IsOK { get; set; }/// <summary>/// 代码总行数/// </summary>public Int64 TotalCount { get; set; }/// <summary>/// 代码字符总数/// </summary>public Int64 TotalCharCount { get; set; }/// <summary>/// 代码信息列表/// </summary>public List<CodeInfo> CodeInfoList { get; set; }/// <summary>/// 统计输出信息/// </summary>public String OutPutInfo { get; set; }}
}

CodeStatisticInfo

主要统计的业务逻辑在CodeCounterService的Calc方法中:

public static CodeStatisticInfo Calc(CodeStatisticCondition condition)
{//1、验证参数var statResult = CheckCondition(condition);if (statResult.IsOK == false){return statResult;}//2、递归获取所有代码目录var dirList = GetFileDir(condition.CodeDirectory);//3、以目录为单位进行遍历统计try{if (condition.IsEnableMultiThread == false) //单线程统计
        {foreach (var dir in dirList){var innerCodeInfoList = GetCodeInfoList(dir, condition);statResult.CodeInfoList.AddRange(innerCodeInfoList);}}else //多线程统计 待统计代码目录较多,文件较大或者个人PC配置渣渣的情况下请慎用
        {var taskCnt = 8; //并发任务数var dictDir = GetGroupDir(taskCnt, dirList);var taskFactory = new TaskFactory();foreach (var kv in dictDir){PowerLogger.AppendLog("任务【{0}】,并发执行{1}个目录的代码统计", kv.Key, kv.Value.Count);var listTask = new List<Task<IList<CodeInfo>>>();foreach (var item in kv.Value){var notifyTask = taskFactory.StartNew<IList<CodeInfo>>(() => { return GetCodeInfoList(item, condition); });listTask.Add(notifyTask);}Task.WaitAll(listTask.ToArray()); //等待一批任务并行执行完成foreach (var tmpTask in listTask){statResult.CodeInfoList.AddRange(tmpTask.Result);}}}}catch (Exception ex){statResult.IsOK = false;statResult.OutPutInfo = string.Format("统计代码发生异常:{0}", ex);}if (statResult.IsOK == false){return statResult;}//4、统计代码总行数及输出statResult.TotalCount = statResult.CodeInfoList.Sum(x => x.LineCount);statResult.TotalCharCount = statResult.CodeInfoList.Sum(x => x.CharCount);var sb = new StringBuilder(1024);sb.AppendFormat("代码总行数:{0}", statResult.TotalCount);sb.AppendLine();sb.AppendFormat("代码总字符数:{0}", statResult.TotalCharCount);sb.AppendLine();if (statResult.CodeInfoList.Any()){sb.Append("代码行数统计明细:");sb.AppendLine();}else{sb.Append("没有匹配的代码文件");}foreach (var codeInfo in statResult.CodeInfoList){sb.Append(codeInfo.FilePath);sb.AppendLine();sb.AppendFormat("【代码行数】:{0}", codeInfo.LineCount);sb.AppendLine();sb.AppendFormat("【代码字符数】:{0}", codeInfo.CharCount);sb.AppendLine();sb.AppendLine();}statResult.OutPutInfo = sb.ToString();return statResult;
}

Calc

二、存在的主要不足和缺点

1、不同语言统计支持没有经过充分测试

目前这个小程序仅仅验证了自己经常使用的几种开发语言,其他语言未验证是否通过。

2、多线程统计支持不好

代码中,我想用Task提升性能,目前测试下来,多线程比单线程耗时更久,非常不友好。本来计划使用多线程技术打开文件并行分析每个文件的代码行数,毕竟,IO和计算密集型程序在多线程下应该能够发挥优势。但是看到根据目录并发分析统计代码效果并不好,所以我就直接放弃了多文件同时分析的实现。

3、统计数据不精确

代码行数统计并不完全准确,“统计”的时候,可能某项目下已经无效的代码也加入了统计。还有就是注释,不同语言的注释解析是个难题。再比如说压缩后的js文件,这个也会造成解析统计的不准确。

demo地址:PowerCodeCalculator

可执行文件下载:PowerCodeCalculator.exe

转载于:https://www.cnblogs.com/jeffwongishandsome/p/Sharing-A-Powerful-Tool-For-Calculate-Code-Lines.html

Sharing A Powerful Tool For Calculate Code Lines相关推荐

  1. Indent tool and KR code style

    为了使得我们写的code代码看上去更加工整美观,我们可以借助一些工作来完成这种技术含量低却耗时的工作,用的比较多的有Indent和Astyle. Indent工具可以指定某种style,例如K& ...

  2. 服务器云ide_语言服务器协议如何影响IDE的未来

    服务器云ide The release of Visual Studio Code single-handedly impacted the developer ecosystem in such a ...

  3. 为什么我们需要monad?

    本文翻译自:Why do we need monads? In my humble opinion the answers to the famous question "What is a ...

  4. Code Project精彩系列(转)

    Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEdit ...

  5. Code Project精彩系列

    Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEdit ...

  6. Code Project精彩系列二

    Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEdit ...

  7. Code Project

    Applications Crafting a C# forms Editor From scratch http://www.codeproject.com/csharp/SharpFormEdit ...

  8. Characterizing, exploiting, and detecting DMA code injection vulnerabilities,Eurosys2021

    Characterizing, exploiting, and detecting DMA code injection vulnerabilities in the presence of an I ...

  9. [译]Visual Studio 2008 Code Metrics

    代码度量(Code Metrics)是用来测量专业标准的软件特性. 在某些方面,它提供了量化的有用反馈给开发者. 查看代码度量值很简单:在项目或解决方案上按右键,选择"Calculate C ...

最新文章

  1. opencv-4.1.0-百度云盘下载链接-环境配置
  2. 初识Docker-Docker架构
  3. 自动装配有哪些局限性?
  4. idea怎么直接拉去git_如何将GitHub上面的项目拉取到IDEA中
  5. android 隐藏所有 fragment,Android 隐藏Fragment
  6. 个人计算机网刻系统,全自动网刻后修改计算机配置信息(网管轻松方便)
  7. 云智慧压测实战分享之JMeter场景设置与监控
  8. 使用roboware创建工作空间
  9. 如何不下载百度网盘下载资源
  10. Java链表与数组间的相互转换
  11. oracle软件 乱码,oracle 中文乱码解决办法
  12. shader函数整理
  13. kafka数据保存时间问题与kafka的性能测试
  14. ChucK初步(1)
  15. yaffs2源码学习2:chunk和block
  16. win10截图软件工具
  17. 让对方计算机死机的代码,微信让对方死机代码是什么?一串代码卡死微信
  18. 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池
  19. Android GPS模块概念简介
  20. pytorch动态网络以及权重共享

热门文章

  1. 问题 K: A+B Problem (III) : Input/Output Practice 山东科技大学OJ c语言
  2. 去中心化加密指数协议DeHive即将4月14日启动公募
  3. ChaiNext:过去24小时大盘震荡调整
  4. YFI创始人旗下多链跨链平台multichain.xyz即将投入使用
  5. YAM将于明日在DegenerativeFinance上发布uSTONKS
  6. 英国央行行长:当前的加密货币不太可能取代法定货币
  7. SAP License:SAP系统上线数据导入的几个注意事项
  8. SAP License:SAP资产管理模块中的相关业务处理
  9. SAP License:SAP委外加工业务
  10. 冷启动阶段的多规则策略如何筛选?