合并所有文件内容到指定文件
申请软著或知识产权用的。主要统计代码行数和合并所有代码文件到一个文件,打印前后各30页这个需要自己打开合并后的文件去打印。
<?php
$output = 'print.txt';
$dir = 'app';
$list = scanFiles('app');
$info = mergeFiles($output, $list);
echo '文件总数:' . count($list) . '个' . PHP_EOL;
echo '代码总量:' . $info['content length'] . '字' . PHP_EOL;
echo '代码行数:' . $info['line total'] . '行' . PHP_EOL;
/**
* 扫描指定目录下的所有文件
* @param string $path 要扫描的目录
* @param string $regex 文件名规则(正则)
* @return array
*/
function scanFiles($path, $regex = '\.(php|html)$')
{
$list = [];
foreach (scandir($path) as $item) {
if ('.' === $item || '..' === $item) continue;
if (is_dir($path . '/' . $item)) {
$list = array_merge($list, scanFiles($path . '/' . $item));
} elseif (is_file($path . '/' . $item)) {
if (!preg_match('@' . $regex . '@', $item)) continue;
$list[] = $path . '/' . $item;
}
}
return $list;
}
/**
* 合并数组中的所有文件
* @param string $output 合并后的内容的输出路径
* @param array $list 要合并的文件列表
* @return array
*/
function mergeFiles($output, $list)
{
$file = fopen($output, 'w+');
$length = 0;
$line = 0;
foreach ($list as $item) {
$itemRes = fopen($item, 'r');
$findEnd = false;
while(!feof($itemRes))
{
$itemLine = fgets($itemRes);
if ($findEnd) {
if (false !== strpos($itemLine, '*/')) {
$findEnd = false;
}
continue;
}
if (preg_match('@^\s*//@', $itemLine)) {
continue;
} elseif (preg_match('@^\s*$@', $itemLine)) {
continue;
} elseif (preg_match('@\s*/\*.*\*/\s*@', $itemLine)) {
continue;
} elseif (false !== strpos($itemLine, '/*')) {
$findEnd = true;
continue;
} else {
$line++;
$length += fwrite($file, $itemLine);
}
}
fclose($itemRes);
}
fclose($file);
return ['content length' => $length, 'line total' => $line];
}
执行效果
# php print.php
文件总数:317个
代码总量:1808293字
代码行数:41856行