加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP汇总目录下的文件总数及代码行数

发布时间:2023-05-26 13:16:01 所属栏目:PHP教程 来源:
导读:PHP汇总目录下的文件总数及代码行数:<?php /** * @author xiaoxiao <x_824@sina.com> 2011-1-12 * @link http://xiaoyaoxia.cnblogs.com/ * @license * 统计目录下的文件行数及总文件数&middot;&middot;去除注释

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"; 

 /** 

  * 是否显示每个文件的统计数,开源代码Cuoxin.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; 

 } 

?> 

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!