`
逍遥虾
  • 浏览: 13289 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

    博客分类:
  • php
阅读更多

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

      

@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 &copy; 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的该方法,放在命令行下运行效果更佳。~

 

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

 

   希望你有个好心情~~~

1
0
分享到:
评论

相关推荐

    Postgresql-DB的访问PHP类.zip

    "Postgresql-DB的访问PHP类.zip"是一个压缩包,包含了一个由外国开发者编写的PHP类,用于方便地连接、查询和管理PostgreSQL数据库。这个类库对于那些想要简化PHP与PostgreSQL之间数据交互的开发者来说是非常有价值的...

    php+mysql类

    这可能包括游标管理,如`mysqli_fetch_assoc()`或`PDO::fetch()`,用于逐行获取数据,以及获取结果集的行数、列数等信息。 5. **事务处理**: 对于涉及多条数据库操作的情况,事务是必不可少的。PHP MySQL类应提供...

    editplus绿色版

    12. **文本统计**:可以统计文本的字符数、单词数和行数,有助于写作和代码审查。 13. **HTML预览**:对于HTML文档,EditPlus提供了实时预览功能,可以在编辑的同时看到页面效果。 14. **自定义用户工具**:用户...

    Editplus好用的文本编辑器

    还可以创建和运行批处理文件,简化重复性任务。同时,EditPlus允许用户自定义快捷键,可以根据个人习惯调整,提高工作效率。 总结起来,EditPlus凭借其全面的语言支持、强大的文本编辑功能、便捷的文件管理以及高度...

    EditPluse开发工具

    - 内置文本计数器,统计字符、单词和行数。 - 高效的宏录制和播放功能,自动化重复任务。 综上所述,EditPlus作为一款全能的文本编辑器,无论是初学者还是经验丰富的开发者,都能从中受益。其丰富的功能、良好的可...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    循环查询SQL数据库

    10. **批量操作**:如果可能,尝试将多个操作合并成一个批处理,这通常比逐个处理更高效。 以上就是关于“循环查询SQL数据库”的详细解释,包括了不同方法、注意事项和优化策略。理解并熟练掌握这些知识点,对于...

    2021-2022计算机二级等级考试试题及答案No.15020.docx

    **详细解释**:自动批处理文件通常用于系统启动时自动执行某些任务,这些文件需要放在启动盘的根目录中。因此,正确答案是 **启动盘的根目录中**,选项 C 描述较为模糊,但按照题目提供的选项,正确答案是 **C**。 ...

    java编程中的JDBC

    为了提高JDBC性能,可以采用一些优化技巧,如批处理(Batch Processing),将多个SQL操作组合成一个批次执行,减少网络通信次数;设置预取行数(Row Prefetching)可以预先加载一定数量的行,减少磁盘I/O。 此外,...

Global site tag (gtag.js) - Google Analytics