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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
function, new function, new Function之间的区别
Mar 08 Javascript
javascript中DOM复选框选择用法实例
May 14 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
前端弹出对话框 js实现ajax交互
Sep 09 Javascript
json数据处理及数据绑定
Jan 25 Javascript
react native仿微信PopupWindow效果的实例代码
Aug 07 Javascript
Vue中props的使用详解
Jun 15 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
详解mpvue开发小程序小总结
Jul 25 Javascript
React Native中Mobx的使用方法详解
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获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
PHP7 新增常量
2021/03/09 PHP
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python修改字典键(key)的方法
2019/08/05 Python
Python @property使用方法解析
2019/09/17 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Android interview questions
2016/12/25 面试题
西式婚礼主持词
2014/03/13 职场文书
中秋晚会策划方案
2014/06/12 职场文书
应聘教师自荐书
2014/06/16 职场文书
地陪导游欢迎词
2015/01/26 职场文书
城管年度个人总结
2015/02/28 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
java基础——多线程
2021/07/03 Java/Android