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 相关文章推荐
jQuery对表单的操作代码集合
Apr 06 Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
Apr 27 Javascript
前台js调用后台方法示例
Dec 02 Javascript
JavaScript eval() 函数介绍及应用示例
Jul 29 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
Vue监听数组变化源码解析
Mar 09 Javascript
vue快捷键与基础指令详解
Jun 01 Javascript
react实现换肤功能的示例代码
Aug 14 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
js 获取扫码枪输入数据的方法
Jun 10 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
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
JS获取当前时间戳方法解析
2020/08/29 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python创建模块及模块导入的方法
2015/05/27 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
numpy数组拼接简单示例
2017/12/15 Python
python学生信息管理系统
2018/03/13 Python
python提取log文件内容并画出图表
2019/07/08 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
自我评价的正确写法
2013/09/19 职场文书
经典公益广告词
2014/03/13 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
外科护士长工作总结
2015/08/12 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
python缺失值的解决方法总结
2021/06/09 Python
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android