用 nodejs 实现一个命令行工具,统计输入目录下面指定代码的行数

以下是一个使用 Node.js 实现的命令行工具,用于统计输入目录下指定代码文件的行数。

实现思路

  1. 接收命令行参数,获取输入目录和文件扩展名(例如,.js.html.css 等)。
  2. 递归遍历输入目录,查找所有符合指定扩展名的文件。
  3. 对于每个找到的文件,读取文件内容并统计行数。
  4. 输出统计结果。

代码实现

const fs = require('fs');
const path = require('path');

// 辅助函数:统计文件的行数
function countLinesInFile(filePath) {
  let lineCount = 0;
  try {
    const content = fs.readFileSync(filePath, 'utf8');
    // 按照换行符拆分内容并计算行数
    lineCount = content.split(/\r\n|\r|\n/).length;
  } catch (error) {
    console.error(`Error reading file ${filePath}: ${error.message}`);
  }
  return lineCount;
}

// 辅助函数:递归遍历目录,查找指定扩展名的文件
function findFilesByExtension(dir, ext, fileList = []) {
  const files = fs.readdirSync(dir);
  for (const file of files) {
    const fullPath = path.join(dir, file);
    const stats = fs.statSync(fullPath);
    if (stats.isDirectory()) {
      // 是目录,继续递归遍历
      findFilesByExtension(fullPath, ext, fileList);
    } else if (path.extname(fullPath) === ext) {
      // 是文件且符合扩展名,添加到列表中
      fileList.push(fullPath);
    }
  }
  return fileList;
}

// 主函数:处理命令行参数和调用辅助函数
function main() {
  const args = process.argv.slice(2);
  if (args.length < 2) {
    console.error('Usage: node lineCounter.js <directory> <fileExtension>');
    process.exit(1);
  }
  const directory = args[0];
  const extension = args[1];
  const files = findFilesByExtension(directory, extension);
  let totalLines = 0;
  for (const file of files) {
    const lines = countLinesInFile(file);
    totalLines += lines;
    console.log(`${file}: ${lines} lines`);
  }
  console.log(`Total lines in ${extension} files: ${totalLines}`);
}

// 调用主函数开始执行
main();

代码解释

  • countLinesInFile(filePath):

    • 该函数接收一个文件路径作为参数。
    • 使用 fs.readFileSync 以 UTF-8 编码读取文件内容。
    • 使用正则表达式 /\r\n|\r|\n/ 将文件内容按换行符拆分,然后统计拆分后的数组长度,得到行数。
    • 若读取文件时出现错误,将错误信息打印出来。
  • findFilesByExtension(dir, ext, fileList = []):

    • 该函数接收目录路径、文件扩展名和一个可选的文件列表作为参数。
    • 读取目录下的文件列表。
    • 对于每个文件,检查其是目录还是文件:
      • 若是目录,递归调用自身,继续查找文件。
      • 若是文件且扩展名符合要求,添加到文件列表中。
  • main():

    • 该函数从命令行参数中获取目录和扩展名。
    • 检查命令行参数是否足够,若不足则打印使用说明并退出程序。
    • 调用 findFilesByExtension 查找指定目录下的文件列表。
    • 遍历文件列表,调用 countLinesInFile 统计每个文件的行数,并累加到 totalLines
    • 打印每个文件的行数和总文件的行数。

使用说明

  1. 将上述代码保存为 lineCounter.js 文件。
  2. 打开命令行,进入该文件所在目录。
  3. 运行命令:node lineCounter.js <directory> <fileExtension>
  • <directory> 是要统计的目录路径,例如:./src
  • <fileExtension> 是文件扩展名,例如:.js

这个工具可以方便地统计指定目录下某种类型文件的行数,对于代码行数的统计和分析非常有用,有助于项目的代码管理和评估。 例如,你可以运行 node lineCounter.js./src/.js 来统计 ./src 目录下所有 .js 文件的行数。

posted @   jialiangzai  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示