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 相关文章推荐
How do I change MySQL timezone?
Mar 26 PHP
phpinfo 系统查看参数函数代码
Jun 05 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
php设计模式之单例模式实例分析
Feb 25 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
详解php的socket通信
Aug 11 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 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+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
python插入排序算法的实现代码
2013/11/21 Python
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
简单了解Python生成器是什么
2019/07/02 Python
Python函数中的可变长参数详解
2019/09/12 Python
Pytorch之Variable的用法
2019/12/31 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
药学职务聘任书
2014/03/29 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
八年级英语教学反思
2016/02/15 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书