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 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
基于initPHP的框架介绍
Apr 18 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
PHP Swoole异步MySQL客户端实现方法示例
Oct 24 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 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获取淘宝分类id示例
2014/01/16 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
php验证手机号码
2015/11/11 PHP
脚本收藏iframe
2006/07/21 Javascript
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
Python 登录网站详解及实例
2017/04/11 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python 实现按对象传值
2019/12/26 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
农田水利实习自我鉴定
2013/09/19 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
兵马俑导游词
2015/02/02 职场文书
消防安全主题班会
2015/08/12 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
初中语文教学研修日志
2015/11/13 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
python基于turtle绘制几何图形
2021/06/15 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
python脚本框架webpy模板赋值实现
2021/11/20 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python