今天要统计下写的代码的行数(去除空行及注释)及目录下的文件总数。首先想到的是一个批处理命令,因为简单而且高效,于是去网上找了下批命令的教程,写了个简单的批命令处理:
@Rem: 本批命令用来计算某个路径下的总文件个数,及总行数。行数的计算不算空行
@Rem: author: 肖肖 xiaoxia.xuxx@alibaba-inc.com
@echo ****************************************************************
@echo off
@echo 使用说明:
@echo 1、更改要计算的路径:将filePath的路径更改为自己的需要的路径。
@echo 2、更改统计的文件后缀,如果需要统计所有文件则将fileExt设置为*,如果只需要统计php文件则将该变量指定为*.php
@echo ****************************************************************
@set fileExt=*.php
@set filePath=D:\PHPAPP\phpwindframework\wind
@setlocal enabledelayedexpansion
@set filenum=0
@set totalnum=0
@for /r %filePath% %%i in (%fileExt%) do (
@set linenum=0 & @set /a filenum+=1 & @echo %%i & (@for /f "usebackq" %%b in (%%i) do @set /a linenum+=1) & @echo 行数:!linenum! & @set /a totalnum+=linenum)
@echo 总行数: %totalnum%行
@echo 总文件数: %filenum%
@pause
具体的命令意思我就不解释了,特别说明下:
我在计算每个文件的行数的时候,就是输出不了linenum,后来经过询问查找,原来是延迟的问题,于是在开头加了命令setlocal enabledelayedexpansion来开启延迟,同时输出采用@echo !linenum!的 这样!!的方式输出。
该批命令可以指定统计处我指定目录下的文件个数(可以指定统计的文件的类型),及总行数(去除了空行)。
但是对于代码统计来说,去除空行及注释的统计才是理想的状态。相对于批命令还是PHP来的给力,所以写了一个PHP版本的统计:
/**
* @author xiaoxia xu <x_824@sina.com> 2011-1-12
* @link http://www.phpwind.com
* @copyright Copyright © 2003-2110 phpwind.com
* @license
* 统计目录下的文件行数及总文件数··去除注释
*/
$fileExt = ".php";
$filePath = "D:\PHPAPP\phpwindframework\wind";
if (!is_dir($filePath)) exit('Path error!');
list($totalnum, $linenum, $filenum) = readGiveDir($filePath, $fileExt);
echo "*************************************************************\r\n";
echo "总行数: " . $totalnum . "\r\n";
echo "总有效行数: " . $linenum . "\r\n";
echo '总文件个数:' . $filenum;
function readGiveDir($dir, $fileExt) {
$totalnum = 0;
$linenum = 0;
$filenum = 0;
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if (in_array($file, array(".", "..", '.svn'))) continue;
if (is_dir($dir . '/' . $file)) {
list($num1, $num2, $num3) = readGiveDir($dir . '/' . $file, $fileExt);
$totalnum += $num1;
$linenum += $num2;
$filenum += $num3;
} else {
if (strrchr($file, '.') == $fileExt) {
list($num1, $num2) = readfiles($dir . '/' . $file);
$totalnum += $num1;
$linenum += $num2;
$filenum ++;
continue;
}
}
}
closedir($dh);
} else {
echo 'open dir <' . $dir . '> error!' . "\r";
}
return array($totalnum, $linenum, $filenum);
}
function readfiles($file) {
echo $file . "\r\n";
//$p = php_strip_whitespace($file);
$str = file($file);
$linenum = 0;
foreach ($str as $value) {
if (skip(trim($value))) continue;
$linenum ++;
}
$totalnum = count(file($file));
echo '行数:' . $totalnum . "\r\n";
echo '有效行数:' . $linenum . "\r\n";
return array($totalnum, $linenum);
}
function skip($string) {
if ($string == '') return true;
$array = array("*", "/*", "//", "#");
foreach ($array as $tag) {
if (strpos($string, $tag) === 0) return true;
}
return false;
}
代码也挺简单,这边就不做解释了,其中我处理跳过空行和注释行的是在skip这个函数中,这里声明了一个数组,用来声明我可以过滤的标签(可以看到这里都是PHP中的注释标签),我在查找的时候只要查找是否这些标签是在最前面的位置即可。但是这样会存在一个问题,当我的代码出现不规范的格式化的时候,可能出现代码中的*乘号进行了换行到了新的一行的开始位置,那也会被过滤掉。但总的来说··这两种统计都满足了我的需求。
Tips: PHP的该方法,放在命令行下运行效果更佳。~
第一次觉得,当我遇到问题的时候,真的用自己的所学做了一些小便利的工具提供给自己使用。哈哈哈···纪念下~~~
希望你有个好心情~~~
分享到:
相关推荐
运行环境,windows,无需任何配置,解压后双击run.bat即可运行。
bat 用批处理获取当前目录下所有文件的路径
功能目标: 从当前目录及子目录下一次性复制所有指定文件,包括查找和复制。 特色: 使用批处理命令一次性完成功能,非常实用! 备注:使用时,请将.txt 改为 .bat即可。
批处理文件编写
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key ...
批处理删除指定文件夹下的所有文件和文件夹
统计目录下指定类型的文件个数,包括子目录等。
Windows清除指定目录下的文件夹以及对应文件,自动获取电脑用户名兼容Windows7、8、10,非常好用的工具。
本文给大家汇总介绍了下使用批处理获取文件夹下面txt文件行数并添加到文件名后的两种方法,思路都很不错,这里推荐给大家。
一个如何编写批处理的文档。希望对大家有所帮助
批处理将文件夹下所有文件拷贝到另一个目录相应的文件夹下,包含子目录文件
批处理查找当前文件夹及其子目录某文件并运行 当前文件夹下(包括子目录下)查找某文件并运行 批处理 bat
详细介绍了编写批处理程序(后缀为.bat)的过程,也有很多实例。
删除指定文件夹下的指定文件批处理,删除文件用del set /p var 是把var当一个变量,你可以在批处理的时候把文件所在的目录输入。用复制就行了,这样子方便!。
提取文件名的批处理文件,可提取本层目录及目录下的所有文件的名称。支持在windows平台运行。
批处理文件的编写,比较详细的说明。
批处理 同名文件 复制 改名 用批处理程序将多个同名文件复制到一个目录下并改名
教你如何编写自己的bat文件!(附几个好用的bat文件) 先举个简单的例子: 让电脑每天在指定时间关机,可以用下面方法 教你批处理文件的编写
批处理某目录下的所有sql文件,快速布置