以下是一个使用 Node.js 实现的命令行工具,用于统计输入目录下指定代码文件的行数。
实现思路
- 接收命令行参数,获取输入目录和文件扩展名(例如,
.js
、.html
、.css
等)。 - 递归遍历输入目录,查找所有符合指定扩展名的文件。
- 对于每个找到的文件,读取文件内容并统计行数。
- 输出统计结果。
代码实现
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
。 - 打印每个文件的行数和总文件的行数。
使用说明
- 将上述代码保存为
lineCounter.js
文件。 - 打开命令行,进入该文件所在目录。
- 运行命令:
node lineCounter.js <directory> <fileExtension>
。
<directory>
是要统计的目录路径,例如:./src
。<fileExtension>
是文件扩展名,例如:.js
。
这个工具可以方便地统计指定目录下某种类型文件的行数,对于代码行数的统计和分析非常有用,有助于项目的代码管理和评估。 例如,你可以运行 node lineCounter.js./src/.js
来统计 ./src
目录下所有 .js
文件的行数。