Node.JS枚举统计当前文件夹和子目录下所有代码文件行数


Posted in Javascript onAugust 23, 2019

使用Node.JS的大多数用记事本开发,有时侯会需要统计工程代码量,然后记事本大部分没有这个功能。其实用node.js几行代码就可以实现。

var path = require('path')
var fs  = require('fs')
//需要统计的文件类型,可自己删减,均小写
var codesFiles = [ '.css', '.js', '.html', '.tmpl', '.part', '.json', '.md', '.txt', '.yml', '.java', '.cs', '.c', '.h', '.cpp', '.xml', '.go', '.py' ]
var LINES = 0
var findFolder = function(srcDir, cb) {
 fs.readdir(srcDir, function(err, files) {
  var count = 0
  var checkEnd = function() {
   ++count == files.length && cb && cb()
  }
  if (err) {
   checkEnd()
   return
  }
  files.forEach(function(file) {
   var extname = path.extname(file).toLowerCase()
   var srcPath = path.join(srcDir, file)
   fs.stat(srcPath, function(err, stats) {
    if (stats.isDirectory()) {
     findFolder(srcPath, checkEnd)
    } else {
     if (codesFiles.indexOf(extname) < 0) {
      checkEnd()
      return
     }
     fs.readFile(srcPath, function(err, data) {
      if (err) {
       checkEnd()
       return
      }
      var lines = data.toString().split('\n')
      LINES += lines.length
      console.log(srcPath, lines.length)
      checkEnd()
     })
    }
   })
  })
  //为空时直接回调
  files.length === 0 && cb && cb()
 })
}
findFolder('./', function() {
 console.log('LINES:', LINES)
})

使用时将此脚本文件命名为lines.js,然后复制到需要统计的文件夹下,然后执行

node lines.js

然后会统计每一个代码文件的长度,和代码总行数:

$ node lines.js
lines.js 56
package.json 6
local\en-US.js 122
local\FE.zh-CN.js 306
...
LINES: 40464

更新

下面的脚本通过检测是否含有ASC0的值来判断文件是不文本文件,然后统计代码行数,但实测统计数量明显偏多。

var path = require('path')
var fs  = require('fs')
var LINES = 0
var FILES = 0
//https://github.com/hellosean1025/study/blob/master/function.js
function isTextFile( filepath, length ) {
 fd = fs.openSync( filepath, 'r' );
 length = length || 1000;
 for( var i = 0;i < length;i++ ) {
   buf = new Buffer( 1 );
   var bytes = fs.readSync( fd, buf, 0, 1, i );
   char = buf.toString().charCodeAt();
   if ( bytes === 0) {
     return true;
   } else if(bytes === 1 && char === 0) {
     return false;
   }
 }
 return true;
}
var findFolder = function(srcDir, cb) {
 fs.readdir(srcDir, function(err, files) {
  var count = 0
  var checkEnd = function() {
   ++count == files.length && cb && cb()
  }
  if (err) {
   checkEnd()
   return
  }
  files.forEach(function(file) {
   var extname = path.extname(file).toLowerCase()
   var srcPath = path.join(srcDir, file)
   fs.stat(srcPath, function(err, stats) {
    if (stats.isDirectory()) {
     findFolder(srcPath, checkEnd)
    } else {
     // if (codesFiles.indexOf(extname) < 0) {
     //  checkEnd()
     //  return
     // }
     if (!isTextFile(srcPath)) {
      checkEnd()
      return
     }
     fs.readFile(srcPath, function(err, data) {
      if (err) {
       checkEnd()
       return
      }
      var lines = data.toString().split('\n')
      LINES += lines.length
      if (lines.length > 5000) {
       console.trace(srcPath, lines.length)       
      } else {
       console.log(srcPath, lines.length)
      }
      FILES++
      checkEnd()
     })
    }
   })
  })
  //为空时直接回调
  files.length === 0 && cb && cb()
 })
}
findFolder('./', function() {
 console.log('LINES:', LINES)
 console.log('FILES:', FILES)
})

总结

以上所述是小编给大家介绍的Node.JS枚举统计当前文件夹和子目录下所有代码文件行数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用jscript实现新建和保存一个word文档
Jun 15 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
Dec 25 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
javascript删除数组元素并且数组长度减小的简单实例
Feb 14 Javascript
javascript获取文档坐标和视口坐标
May 26 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
Jun 25 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
js模仿java的Map集合详解
Jan 06 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
JavaScript九九乘法口诀表的简单实现
Oct 04 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 #Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 #Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 #Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 #Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 #Javascript
VUE实现移动端列表筛选功能
Aug 23 #Javascript
简述ES6新增关键字let与var的区别
Aug 23 #Javascript
You might like
请php正则走开
2008/03/15 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
利用php输出不同的心形图案
2016/04/22 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
react-router实现按需加载
2017/05/09 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
python实现多人聊天室
2020/03/31 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
python palywright库基本使用
2021/01/21 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
UNIX特点都有哪些
2016/04/05 面试题
学习雷锋精神演讲稿
2014/05/10 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
授权委托书
2014/07/31 职场文书
四风问题自我剖析材料
2014/10/07 职场文书