-
PHP统计目录下的文件总数及代码行数
- <?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:phpappphp_tests");
- //所有文件,(默认格式为.php)
- $obj->setfileskip(array());
- $obj->run("d:phpappphp");
- $obj->setshowflag(true);
- //跳过所有i和a开头的文件,(比如接口和抽象类开头)
- $obj->setfileskip(array('i', 'a'));
- $obj->run("d:phpappphp");
- /**
- * 执行目录中文件的统计(包括文件数及总行数
- *
- * 1、跳过文件的时候:
- * 匹配的规则只是从文件名上着手,匹配的规则也仅限在开头。
- * 2、跳过文件中的注释行:
- * 匹配的规则只是从注释段落的头部匹配,如果出现// 及 *及 #及/*开头的行及空行会被跳过。所以类似/*这种多汗注释,每行的开头都必须加上*号,否则无法匹配到这种的注释。
- * 3、目录过滤:
- * 匹配的规则是从目录名的全名匹配
- */
- class caculatefiles {
- /**
- * 统计的后缀
- */
- private $ext = ".php";
- /**
- * 是否显示每个文件的统计数,开源代码phpfensi.com
- */
- 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 "*************************************************************rn<br/>";
- echo $dir . ":rn<br/>";
- echo "totalline: " . $totalline . "rn<br/>";
- echo "totalline with no comment and empty: " . $linenum . "rn<br/>";
- echo 'totalfiles:' . $filenum . "rn<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 . "rn";
- echo 'totalline in the file:' . $totalnum . "rn";
- echo 'totalline with no comment and empty in the file:' . $linenum . "rn";
- 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;
- }
- }
- ?>
出处:http://www.phpfensi.com/php/20140805/4218.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式