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 相关文章推荐
可输入的下拉框
Jun 19 Javascript
网站上面有这种切换效果
Jun 26 Javascript
JavaScript中的类继承
Nov 25 Javascript
jQuery 判断元素整理汇总
Feb 28 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
Webpack实战加载SVG的方法
Dec 26 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
谈一谈vue请求数据放在created好还是mounted里好
Jul 27 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 Vue.js
Vue如何实现变量表达式选择器
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
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
js实现扫雷源代码
2020/11/27 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
python中的代码编码格式转换问题
2015/06/10 Python
Python中特殊函数集锦
2015/07/27 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
新闻专业应届生求职信
2013/10/31 职场文书
工会主席岗位责任制
2014/02/11 职场文书
作文批改评语大全
2014/04/23 职场文书
地球一小时宣传标语
2014/06/24 职场文书
法院授权委托书范文
2014/08/02 职场文书
维稳工作情况汇报
2014/10/27 职场文书
财产分割协议书范本
2014/11/03 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL