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 相关文章推荐
不使用中间变量,交换int型的 a, b两个变量的值。
Oct 29 Javascript
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
Apr 14 Javascript
javascript SpiderMonkey中的函数序列化如何进行
Dec 05 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
js判断ie版本号的简单实现代码
Mar 05 Javascript
使用documentElement正确取得当前可见区域的大小
Jul 25 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
jQuery实现的自定义滚动条实例详解
Sep 20 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
JavaScript中document.referrer的用法详解
Jul 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
hadoop中一些常用的命令介绍
2013/06/19 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
numpy实现RNN原理实现
2021/03/02 Python
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
什么是继承
2013/12/07 面试题
交警个人先进事迹材料
2014/05/11 职场文书
情人节活动总结范文
2015/02/05 职场文书