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 相关文章推荐
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
jquery实现的鼠标下拉滚动置顶效果
Jul 24 Javascript
jQuery将多条数据插入模态框的示例代码
Sep 25 Javascript
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
ajax读取数据后使用jqchart显示图表的方法
Jun 10 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
JavaScript用select实现日期控件
Jul 17 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
Apr 01 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
Nov 10 Javascript
javascript滚轮事件基础实例讲解(37)
Feb 14 Javascript
深入理解vue中的slot与slot-scope
Apr 22 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
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入门学习知识点三 PHP上传
2011/07/14 PHP
微信支付开发维权通知实例
2016/07/12 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
python清空命令行方式
2020/01/13 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
python 的topk算法实例
2020/04/02 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
JSF的标签库有哪些
2012/04/27 面试题
会计出纳岗位职责
2013/12/25 职场文书
教师工作态度自我评价
2015/03/05 职场文书
恰同学少年观后感
2015/06/08 职场文书