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中的location用法简单介绍
Mar 07 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
Apr 29 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
Nov 06 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
vue2.0 和 animate.css的结合使用
Dec 12 Javascript
layui异步加载table表中某一列数据的例子
Sep 16 Javascript
vue实现多级菜单效果
Oct 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
基于php冒泡排序算法的深入理解
2013/06/09 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
php实现记事本案例
2020/10/20 PHP
jquery.validate使用攻略 第二部
2010/07/01 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
9种python web 程序的部署方式小结
2014/06/30 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python中的异常处理简明介绍
2015/04/13 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
酒后驾驶检讨书
2014/01/27 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
安全标兵事迹材料
2014/08/17 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
2015年教师节慰问信
2015/03/23 职场文书
新闻通讯稿范文
2015/07/22 职场文书