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 模式设计之工厂模式详细说明
May 10 Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 Javascript
微信小程序本作用域下调用全局JS详解及实例
Feb 22 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
Vue.js实现分页查询功能
Nov 15 Javascript
js实现鼠标单击Tab表单切换效果
May 16 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
Jul 23 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
使用localStorage替代cookie做本地存储
Sep 25 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 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
怎样在php中使用PDF文档功能
2006/10/09 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php绘制一条直线的方法
2015/01/24 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
PHP加密解密类实例分析
2015/04/20 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
javascript各种复制代码收集
2008/09/20 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
require.js的用法详解
2015/10/20 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
我就是这样学习Python中的列表
2019/06/02 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript