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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
PHP实现WebService的简单示例和实现步骤
Mar 27 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP的全局错误处理详解
Apr 25 PHP
Laravel学习教程之从入口到输出过程详解
Aug 27 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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
C# Assembly类访问程序集信息
2009/06/13 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
js中function()使用方法
2013/12/24 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
文职个人求职信范文
2013/09/23 职场文书
电大物流学生的自我评价
2013/10/25 职场文书
优秀交警事迹材料
2014/01/26 职场文书
项目转让协议书
2014/10/27 职场文书
最感人的道歉情书
2015/05/12 职场文书
门球健将观后感
2015/06/16 职场文书
护士业务学习心得体会
2016/01/25 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
JS实现数组去重的11种方法总结
2022/04/04 Javascript