PHP统计目录下的文件总数及代码行数(去除注释及空行)


Posted in PHP onJanuary 17, 2011

<?php
/**
* @author xiaoxiao <x_824@sina.com> 2011-1-12
* @link http://xiaoyaoxia.cnblogs.com/
* @license
* 统计目录下的文件行数及总文件数··去除注释
*/

$obj = new CaculateFiles();
//如果设置为false,这不会显示每个文件的信息,否则显示
$obj->setShowFlag(false);
//会跳过所有All开头的文件
$obj->setFileSkip(array('All'));
$obj->run("D:\PHPAPP\php\_tests");

//所有文件,(默认格式为.php)
$obj->setFileSkip(array());
$obj->run("D:\PHPAPP\php");

$obj->setShowFlag(true);
//跳过所有I和A开头的文件,(比如接口和抽象类开头)
$obj->setFileSkip(array('I', 'A'));
$obj->run("D:\PHPAPP\php");

/**
* 执行目录中文件的统计(包括文件数及总行数
*
* 1、跳过文件的时候:
* 匹配的规则只是从文件名上着手,匹配的规则也仅限在开头。
* 2、跳过文件中的注释行:
* 匹配的规则只是从注释段落的头部匹配,如果出现// 及 *及 #及/*开头的行及空行会被跳过。所以类似/*这种多汗注释,每行的开头都必须加上*号,否则无法匹配到这种的注释。
* 3、目录过滤:
* 匹配的规则是从目录名的全名匹配
*/
class CaculateFiles {
/**
* 统计的后缀
*/
private $ext = ".php";
/**
* 是否显示每个文件的统计数
*/
private $showEveryFile = true;
/**
* 文件的的跳过规则
*/
private $fileSkip = array();
/**
* 统计的跳过行规则
*/
private $lineSkip = array("*", "/*", "//", "#");
/**
* 统计跳过的目录规则
*/
private $dirSkip = array(".", "..", '.svn');

public function __construct($ext = '', $dir = '', $showEveryFile = true, $dirSkip = array(), $lineSkip = array(), $fileSkip = array()) {
$this->setExt($ext);
$this->setDirSkip($dirSkip);
$this->setFileSkip($fileSkip);
$this->setLineSkip($lineSkip);
$this->setShowFlag($showEveryFile);
$this->run($dir);
}

public function setExt($ext) {
trim($ext) && $this->ext = strtolower(trim($ext));
}
public function setShowFlag($flag = true) {
$this->showEveryFile = $flag;
}
public function setDirSkip($dirSkip) {
$dirSkip && is_array($dirSkip) && $this->dirSkip = $dirSkip;
}
public function setFileSkip($fileSkip) {
$this->fileSkip = $fileSkip;
}
public function setLineSkip($lineSkip) {
$lineSkip && is_array($lineSkip) && $this->lineSkip = array_merge($this->lineSkip, $lineSkip);
}
/**
* 执行统计
* @param string $dir 统计的目录
*/
public function run($dir = '') {
if ($dir == '') return;
if (!is_dir($dir)) exit('Path error!');
$this->dump($dir, $this->readDir($dir));
}

/**
* 显示统计结果
* @param string $dir 目录
* @param array $result 统计结果(包含总行数,有效函数,总文件数
*/
private function dump($dir, $result) {
$totalLine = $result['totalLine'];
$lineNum = $result['lineNum'];
$fileNum = $result['fileNum'];
echo "*************************************************************\r\n<br/>";
echo $dir . ":\r\n<br/>";
echo "TotalLine: " . $totalLine . "\r\n<br/>";
echo "TotalLine with no comment and empty: " . $lineNum . "\r\n<br/>";
echo 'TotalFiles:' . $fileNum . "\r\n<br/>";
}

/**
* 读取目录
* @param string $dir 目录
*/
private function readDir($dir) {
$num = array('totalLine' => 0, 'lineNum' => 0, 'fileNum' => 0);
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if ($this->skipDir($file)) continue;
if (is_dir($dir . '/' . $file)) {
$result = $this->readDir($dir . '/' . $file);
$num['totalLine'] += $result['totalLine'];
$num['lineNum'] += $result['lineNum'];
$num['fileNum'] += $result['fileNum'];
} else {
if ($this->skipFile($file)) continue;
list($num1, $num2) = $this->readfiles($dir . '/' . $file);
$num['totalLine'] += $num1;
$num['lineNum'] += $num2;
$num['fileNum']++;
}
}
closedir($dh);
} else {
echo 'open dir <' . $dir . '> error!' . "\r";
}
return $num;
}

/**
* 读取文件
* @param string $file 文件
*/
private function readfiles($file) {
$str = file($file);
$linenum = 0;
foreach ($str as $value) {
if ($this->skipLine(trim($value))) continue;
$linenum++;
}
$totalnum = count(file($file));
if (!$this->showEveryFile) return array($totalnum, $linenum);
echo $file . "\r\n";
echo 'TotalLine in the file:' . $totalnum . "\r\n";
echo 'TotalLine with no comment and empty in the file:' . $linenum . "\r\n";
return array($totalnum, $linenum);
}

/**
* 执行跳过的目录规则
* @param string $dir 目录名
*/
private function skipDir($dir) {
if (in_array($dir, $this->dirSkip)) return true;
return false;
}

/**
* 执行跳过的文件规则
* @param string $file 文件名
*/
private function skipFile($file) {
if (strtolower(strrchr($file, '.')) != $this->ext) return true;
if (!$this->fileSkip) return false;
foreach ($this->fileSkip as $skip) {
if (strpos($file, $skip) === 0) return true;
}
return false;
}

/**
* 执行文件中行的跳过规则
* @param string $string 行内容
*/
private function skipLine($string) {
if ($string == '') return true;
foreach ($this->lineSkip as $tag) {
if (strpos($string, $tag) === 0) return true;
}
return false;
}
}

PHP 相关文章推荐
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
eAccelerator的安装与使用详解
Jun 13 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
php无限分类使用concat如何实现
Nov 05 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
mongodb和php的用法详解
Mar 25 PHP
php短域名转换为实际域名函数
Jan 17 #PHP
PHP学习笔记之三 数据库基本操作
Jan 17 #PHP
PHP学习笔记之二
Jan 17 #PHP
PHP学习笔记之一
Jan 17 #PHP
php下连接mssql2005的代码
Jan 17 #PHP
Php Image Resize图片大小调整的函数代码
Jan 17 #PHP
php生成随机密码的几种方法
Jan 17 #PHP
You might like
php 获取全局变量的代码
2011/04/21 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
python局部赋值的规则
2013/03/07 Python
使用python开发vim插件及心得分享
2014/11/04 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
为什么是 Python -m
2020/06/19 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
社区十八大感言
2014/01/19 职场文书
运动会致辞稿50字
2014/02/04 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
小学生寒假家长评语
2014/04/16 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
服务承诺书
2015/01/19 职场文书
自荐信模板大全
2015/03/27 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js
JS class语法糖的深入剖析
2022/07/07 Javascript