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 相关文章推荐
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
基于jQuery.Validate验证库知识点的详解
Apr 26 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
JavaScript使用cookie记录临时访客信息的方法
Apr 07 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
纯js的右下角弹窗实例
Mar 12 Javascript
vue better-scroll插件使用详解
Jan 25 Javascript
微信小程序左滑删除功能开发案例详解
Nov 12 Javascript
React Native中Mobx的使用方法详解
Dec 04 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 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/05/18 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
JS复制到剪贴板示例代码
2013/10/30 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
详解JS函数重载
2014/12/04 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
Node.js实现文件上传
2016/07/05 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
村干部四风问题整改措施
2014/09/30 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
委托书范本格式
2019/04/18 职场文书
工作计划范文之财务管理
2019/08/09 职场文书