最近正好需要统计下某项目代码行数,然后就找代码行数统计工具。以前找到过一个正则表达式,但是只有在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 = ; //并发任务数
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();
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

Sharing A Powerful Tool For Calculate Code Lines的更多相关文章

  1. Sharing A Powerful Tool For Application Auto Monitor

    本文分享的这个应用监控小工具,本来是我在五年多以前开发实现的windows服务监控的一个windows服务.听上去比较拗口吧,是的,这个应用一开始就是个监控windows服务的windows服务. 记 ...

  2. [tool] Visual Studio Code python配置

    语言设置 安装中文插件即可成为中文 选择一个Python解释器 Python是一种解释型语言,为了运行Python代码并获取Python IntelliSense,您必须告诉VS Code使用哪个解释 ...

  3. 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)

    从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...

  4. 计算机视觉code与软件

    Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...

  5. Code Project精彩系列(转)

    Code Project精彩系列(转)   Code Project精彩系列(转)   Applications Crafting a C# forms Editor From scratch htt ...

  6. Code Complete阅读笔记(二)

    2015-03-06   328   Unusual Data Types    ——You can carry this technique to extremes,putting all the ...

  7. (2)入门指南——(7)添加jquery代码(Adding our jQuery code)

    Our custom code will go in the second, currently empty, JavaScript file which we included from the H ...

  8. source code analyzer 功能强大的C/C++源代码分析软件 Celerity CRACK 破解版

    特色 迅捷是一个功能强大的C/C++源代码分析软件.可以处理数百万行的源程序代码.支持标准及K&R风格的C/C++.对每一个打开的源代码工程,通过建立一个包含丰富交叉引用关系的数据库,显示其所 ...

  9. Top 40 Static Code Analysis Tools

    https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ In this article, I have ...

随机推荐

  1. TotoiseSVN的基本使用方法

    TotoiseSVN的基本使用方法 在 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]中,我已经讲解了怎样安装TortoiseSVN.在上面的讲解中已经讲了怎么使用VisualS ...

  2. jQuery 追加元素的方法如append、prepend、before,after(转)

    1.jQuery append() 方法 jQuery append() 方法在被选元素的结尾插入内容. 实例 复制代码代码如下: $("p").append("Some ...

  3. 普林斯顿算法课第四周作业_8Puzzle

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html 作业难点: 1.如何求一个Puzzle的解? 根据作业提示,使 ...

  4. SQL执行效率和性能测试方法总结

    对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提高执行效率和整体运行性能.如何选择SQL语句,本文提供了两种方法,分别对多条SQL进行量化 ...

  5. 诡异的localhost无法连接

    上午试了localhost发现提示无法连接,ping了下localhost,能够ping通. 重启了Apache,还是无法解决. 试着停止了Apache服务,然后再连接localhost,发现浏览器提 ...

  6. 【转】《从入门到精通云服务器》第七讲—负载均衡和CDN技术

    在IDC知识中,我们常常会遇上负载均衡与CDN的概念而不知所云.第一讲[什么是云计算], 我们提到过负载均衡,仅给大家留下了印象.这次我们将深入浅出的讲讲到底什么是负载均衡与CDN技术.---互联网数 ...

  7. ZOJ-3820 Building Fire Stations 题解

    题目大意: 一棵树,在其中找两个点,使得其他点到这两个的距离的较小值的最大值的最小值及其方案. 思路: 首先显然一棵树的直径的中点到其他点的距离的最大值必定比其他点的小. 那么感性思考一下就将一棵树的 ...

  8. swift-string(字符串的一些语法)

    1 isEmpty 返回一个布尔值,确定该字符串是否为空 2 hasPrefix(prefix: String) 函数检查给定的参数字符串是否以 string 为前缀 3 hasSuffix(suff ...

  9. 使用配置文件定义ADO.NET 的连接字符串

    最近一直在学习ADO.NET的相关知识,发现要对数据库操作的地方都要先创建一个连接字符串: string constr ="Data Source=(local);Initial Catal ...

  10. 使用VisualVM分析性能

    性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...