PHP统计目录下的文件总数及代码行数
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-05 16:35:14 浏览: 评论:0
- <?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;
- }
- }
- ?>
Tags: PHP统计目录 文件总数
- 上一篇:php ExcelReader读取excel文件
- 下一篇:php查询ip所在地代码
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)