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 相关文章推荐
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
jQuery修改class属性和CSS样式整理
Jan 30 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
Oct 10 Javascript
jQuery 获取页面li数组并删除不在数组中的key
Aug 02 Javascript
JavaScript微信定位功能实现方法
Nov 29 Javascript
Vue键盘事件用法总结
Apr 18 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
Vue兼容ie9的问题全面解决方案
Jun 19 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
Jul 30 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垃圾回收机制引用计数器概念分析
2013/06/24 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
javascript实现简易聊天室
2019/07/12 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python 多进程、多线程效率对比
2020/11/19 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
全民健身日活动方案
2014/01/29 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
买卖车协议书
2014/04/21 职场文书
教师考核评语大全
2014/12/31 职场文书
罚款通知怎么写
2015/04/22 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
《包身工》教学反思
2016/02/23 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电
springboot用户数据修改的详细实现
2022/04/06 Java/Android