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 相关文章推荐
setTimeout()递归调用不加引号出错的解决方法
Sep 05 Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 Javascript
ExpressJS入门实例
Jan 14 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
jQuery实现打开页面渐现效果示例
Jul 27 Javascript
详解axios在vue中的简单配置与使用
May 10 Javascript
详解angular2如何手动点击特定元素上的点击事件
Oct 16 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
Vue实现省市区三级联动
Dec 27 Vue.js
JS实现扫雷项目总结
May 19 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
咖啡语言
2021/03/03 咖啡文化
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
学习JavaScript的最佳方法分享
2011/10/21 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
Vue核心概念Getter的使用方法
2019/01/18 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
巴西网上药房:onofre
2016/11/21 全球购物
肯尼迪就职演说稿
2013/12/31 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
品质标语大全
2014/06/21 职场文书
医生个人年终总结
2015/02/28 职场文书
小学校长开学致辞
2015/07/29 职场文书