Sharing A Powerful Tool For Calculate Code Lines
最近正好需要统计下某项目代码行数,然后就找代码行数统计工具。以前找到过一个正则表达式,但是只有在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的更多相关文章
- Sharing A Powerful Tool For Application Auto Monitor
本文分享的这个应用监控小工具,本来是我在五年多以前开发实现的windows服务监控的一个windows服务.听上去比较拗口吧,是的,这个应用一开始就是个监控windows服务的windows服务. 记 ...
- [tool] Visual Studio Code python配置
语言设置 安装中文插件即可成为中文 选择一个Python解释器 Python是一种解释型语言,为了运行Python代码并获取Python IntelliSense,您必须告诉VS Code使用哪个解释 ...
- 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)
从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...
- 计算机视觉code与软件
Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...
- Code Project精彩系列(转)
Code Project精彩系列(转) Code Project精彩系列(转) Applications Crafting a C# forms Editor From scratch htt ...
- Code Complete阅读笔记(二)
2015-03-06 328 Unusual Data Types ——You can carry this technique to extremes,putting all the ...
- (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 ...
- source code analyzer 功能强大的C/C++源代码分析软件 Celerity CRACK 破解版
特色 迅捷是一个功能强大的C/C++源代码分析软件.可以处理数百万行的源程序代码.支持标准及K&R风格的C/C++.对每一个打开的源代码工程,通过建立一个包含丰富交叉引用关系的数据库,显示其所 ...
- Top 40 Static Code Analysis Tools
https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ In this article, I have ...
随机推荐
- 修改cmd的字体为Consolas字体
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe] ...
- Beginning Scala study note(3) Object Orientation in Scala
1. The three principles of OOP are encapsulation(封装性), inheritance(继承性) and polymorphism(多态性). examp ...
- sorl入门
本教程是从别人的基础上借鉴整理的 Solr是一个独立的企业级搜索应用服务器,它对外提供API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引(solr生成倒排索引,数 ...
- 恶心的content
getBaseContent getApplicationContent ...
- java微信公众号开发----搭建ngrok环境
下载ngrok,一个能够在公网安全访问内网Web主机的工具 下载地址:http://download.csdn.net/download/u014252425/9389847,亲测可用 下载完成后,进 ...
- C#开发笔记
Dictionary 检查后获取值:Dictionary.TryGetValue() KeyValuePair<T, K> 的非泛型形式:DictionaryEntry List 由ILi ...
- bzoj 3507: [Cqoi2014]通配符匹配
Description 几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户.最常见的通配符有两个,一个是星号(“”’),可以匹配0个及以上的任意字符:另一个是问号(“?”),可 ...
- 关于DOM对象与JQuery对象的那些事
这个问题源自上一次的工作室讨论班,主题是"jQuery选择器的使用",在讨论班的结尾,我留了一个思考题: jQuery获取到的对象和直接调用原生Javascript方法获得的对象 ...
- 20161022 NOIP模拟赛 T1 解题报告
旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...
- C# uploadify 上传 -220 IO Error 问题
1. 前端: uploadify 上文件大小限制配置. 2. 后端: web.config 配置 <?xml version="1.0"?> <configura ...