批处理及PHP编写目录下的统计文件行数及个数

来源:互联网 发布:搞笑电影推荐 知乎 编辑:程序博客网 时间:2024/06/05 16:45

 今天要统计下写的代码的行数(去除空行及注释)及目录下的文件总数。首先想到的是一个批处理命令,因为简单而且高效,于是去网上找了下批命令的教程,写了个简单的批命令处理: 

      

批处理代码  收藏代码
  1. @Rem: 本批命令用来计算某个路径下的总文件个数,及总行数。行数的计算不算空行  
  2. @Rem: author: 肖肖 xiaoxia.xuxx@alibaba-inc.com  
  3. @echo ****************************************************************  
  4. @echo off  
  5. @echo 使用说明:  
  6. @echo 1、更改要计算的路径:将filePath的路径更改为自己的需要的路径。  
  7. @echo 2、更改统计的文件后缀,如果需要统计所有文件则将fileExt设置为*,如果只需要统计php文件则将该变量指定为*.php  
  8. @echo ****************************************************************  
  9.   
  10. @set fileExt=*.php  
  11. @set filePath=D:\PHPAPP\phpwindframework\wind  
  12.   
  13. @setlocal enabledelayedexpansion  
  14. @set filenum=0  
  15. @set totalnum=0  
  16. @for /r %filePath% %%i in (%fileExt%) do (  
  17.     @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)  
  18.   
  19. @echo 总行数: %totalnum%行  
  20. @echo 总文件数: %filenum%  
  21. @pause  

 

      具体的命令意思我就不解释了,特别说明下:

   我在计算每个文件的行数的时候,就是输出不了linenum,后来经过询问查找,原来是延迟的问题,于是在开头加了命令setlocal enabledelayedexpansion来开启延迟,同时输出采用@echo !linenum!的 这样!!的方式输出。

该批命令可以指定统计处我指定目录下的文件个数(可以指定统计的文件的类型),及总行数(去除了空行)。

但是对于代码统计来说,去除空行及注释的统计才是理想的状态。相对于批命令还是PHP来的给力,所以写了一个PHP版本的统计:

   

Php代码  收藏代码
  1. /** 
  2.  * @author xiaoxia xu <x_824@sina.com> 2011-1-12 
  3.  * @link http://www.phpwind.com 
  4.  * @copyright Copyright &copy; 2003-2110 phpwind.com 
  5.  * @license 
  6.  * 统计目录下的文件行数及总文件数··去除注释 
  7.  */  
  8.   
  9.   
  10. $fileExt = ".php";  
  11. $filePath = "D:\PHPAPP\phpwindframework\wind";  
  12. if (!is_dir($filePath)) exit('Path error!');  
  13. list($totalnum$linenum$filenum) = readGiveDir($filePath$fileExt);  
  14. echo "*************************************************************\r\n";  
  15. echo "总行数: " . $totalnum . "\r\n";  
  16. echo "总有效行数: " . $linenum . "\r\n";  
  17. echo '总文件个数:' . $filenum;  
  18.   
  19.   
  20. function readGiveDir($dir$fileExt) {  
  21.     $totalnum = 0;  
  22.     $linenum = 0;  
  23.     $filenum = 0;  
  24.     if ($dh = opendir($dir)) {  
  25.         while (($file = readdir($dh)) !== false) {  
  26.             if (in_array($filearray("."".."'.svn'))) continue;  
  27.             if (is_dir($dir . '/' . $file)) {  
  28.                 list($num1$num2$num3) = readGiveDir($dir . '/' . $file$fileExt);  
  29.                 $totalnum += $num1;  
  30.                 $linenum += $num2;  
  31.                 $filenum += $num3;  
  32.             } else {  
  33.                 if (strrchr($file'.') == $fileExt) {  
  34.                     list($num1$num2) = readfiles($dir . '/' . $file);  
  35.                     $totalnum += $num1;  
  36.                     $linenum += $num2;  
  37.                     $filenum ++;  
  38.                     continue;  
  39.                 }  
  40.             }  
  41.         }  
  42.         closedir($dh);  
  43.     } else {  
  44.         echo 'open dir <' . $dir . '> error!' . "\r";  
  45.     }  
  46.     return array($totalnum$linenum$filenum);  
  47. }  
  48.   
  49. function readfiles($file) {  
  50.     echo $file . "\r\n";  
  51.     //$p = php_strip_whitespace($file);  
  52.     $str = file($file);  
  53.     $linenum = 0;  
  54.     foreach ($str as $value) {  
  55.         if (skip(trim($value))) continue;  
  56.         $linenum ++;  
  57.     }  
  58.     $totalnum = count(file($file));  
  59.     echo '行数:' . $totalnum . "\r\n";  
  60.     echo '有效行数:' . $linenum . "\r\n";  
  61.     return array($totalnum$linenum);  
  62. }  
  63.   
  64. function skip($string) {  
  65.     if ($string == ''return true;  
  66.     $array = array("*""/*""//""#");  
  67.     foreach ($array as $tag) {  
  68.         if (strpos($string$tag) === 0) return true;  
  69.     }  
  70.     return false;  
  71. }  

 

 

   代码也挺简单,这边就不做解释了,其中我处理跳过空行和注释行的是在skip这个函数中,这里声明了一个数组,用来声明我可以过滤的标签(可以看到这里都是PHP中的注释标签),我在查找的时候只要查找是否这些标签是在最前面的位置即可。但是这样会存在一个问题,当我的代码出现不规范的格式化的时候,可能出现代码中的*乘号进行了换行到了新的一行的开始位置,那也会被过滤掉。但总的来说··这两种统计都满足了我的需求。

Tips: PHP的该方法,放在命令行下运行效果更佳。~

 

   第一次觉得,当我遇到问题的时候,真的用自己的所学做了一些小便利的工具提供给自己使用。哈哈哈···纪念下~~~

原创粉丝点击