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 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
js ajaxfileupload.js上传报错的解决方法
May 05 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
jquery轮播的实现方式 附完整实例
Jul 28 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
javascript获取select值的方法完整实例
Jun 20 Javascript
通过实例解析vuejs如何实现调试代码
Jul 16 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 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/07/02 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
使用PHP开发留言板功能
2019/11/19 PHP
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
微信JS接口大全
2016/08/25 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
python在指定目录下查找gif文件的方法
2015/05/04 Python
简单实现python数独游戏
2018/03/30 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
三八妇女节活动总结
2014/05/04 职场文书
导游词开场白
2015/01/31 职场文书
党员个人总结自评
2015/02/14 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2016新春团拜会致辞
2015/08/01 职场文书