nodejs使用递归对一个文件夹里所有文件进行合并

合并脚本如下

var fs=require('fs');
var path = require('path');
var searchFileFolder="./src";//搜索的文件夹
var searchFileNameIncludeString = ".d.ts";//搜索的文件名包含的字符串
var searchFileNameExcludeString = "";//搜索的文件名不包含的字符
var outputPlace = "./out/three.d.ts";

var fileList  = [];
var timeStart = new Date();
var filePath = path.resolve(searchFileFolder);

var startMerge = function(files){
	var arr=[];
	files.forEach(function (f) {//回调函数中的f对应每一个文件名
	var info=fs.statSync(f);//fs.stat() 检查一个文件是否存在
	if(info.mode==33206){
	    arr.push(f);
	}
	});
	var content='';
	arr.forEach(function (f) {
	    // console.log(f);
	    var c= fs.readFileSync(f);
	     content+=c.toString()+'\n';
	});
	/*
	'flag': 'a' //追加内容不覆盖
	'flag': 'w' //默认会覆盖之前的内容
	'encoding':'utf-8'
	'mode':'438'
	*/
	fs.writeFile(outputPlace,content,{'encoding':'utf-8','flag':'w','mode':438},function(err){
		console.log("写入结束",err);
	});
}

var startSearchFileSecond = function(searchPath,downCallBack){
	var readdir = promisify(fs.readdir);
	var stat = promisify(fs.stat);
	var readFile = promisify(fs.readFile);
	 
	// 简单实现一个promisify
	function promisify(fn) {
	  return function() {
	    var args = arguments;
	    return new Promise(function(resolve, reject) {
	      [].push.call(args, function(err, result) {
	        if(err) {
	          console.log(err)
	          reject(err);
	        }else {
	          resolve(result);
	        }
	      });
	      fn.apply(null, args);
	    });
	  }
	}
	 
	function readDirRecur(file, callback) {
	  return readdir(file).then((files) => {
	    files = files.map((item) => {
	      var fullPath = file + '/' + item;
	 
	      return stat(fullPath).then((stats) => {
	          if (stats.isDirectory()) {
	              return readDirRecur(fullPath, callback);
	          } else {
	            /*not use ignore files*/
	            if(item[0] == '.'){
	              //console.log(item + ' is a hide file.');
	            } 
	            else 
	            {
	             if(item.indexOf(searchFileNameIncludeString)>=0&&(searchFileNameExcludeString==""||item.indexOf(searchFileNameExcludeString)<0))
	              callback && callback(fullPath)
	            }
	          }
	        })
	    });
	    return Promise.all(files);
	  });
	}
	 
	 
	readDirRecur(searchPath, function(filePath) {
	  fileList.push(filePath)
	}).then(function() {
	  console.log('done', new Date() - timeStart); //done 3.3
	  console.log("一共找到文件数目:",fileList.length); //打印出目录下的所有文件
	  console.log("开始写入");
	  if(downCallBack)downCallBack(fileList);
	}).catch(function(err) {
	  console.log(err);
	});

}

var startSearchFileFirst = function(searchPath,downCallBack){
	function readDirRecur(folder, callback) {
	  fs.readdir(folder, function(err, files) {
	    var count = 0
	    var checkEnd = function() {
	      ++count == files.length && callback()
	    }
	    files.forEach(function(file) {
	      var fullPath = folder + '/' + file;
	 
	      fs.stat(fullPath, function(err, stats) {
	        if (stats.isDirectory()) {
	            return readDirRecur(fullPath, checkEnd);
	        } 
	        else 
	        {
	          /*not use ignore files*/
	          if(file[0]=='.')
	          {

	          }
	          else if(file.indexOf(searchFileNameIncludeString)>=0&&(searchFileNameExcludeString==""||file.indexOf(searchFileNameExcludeString)<0))
	          {
	               fileList.push(fullPath) 
	          } 
	          checkEnd()
	        }
	      })
	    })
	    //为空时直接回调
	    files.length === 0 && callback()
	  })
	}

	readDirRecur(searchPath, function(filePath) {
	    console.log('done', new Date() - timeStart);//done 3
	    console.log("一共找到文件数目:",fileList.length); //打印出目录下的所有文件
	    console.log("开始写入");
	    if(downCallBack)downCallBack(fileList);
    })

}

startSearchFileFirst(filePath,startMerge);

nodejs关于IO流的一些基础用法

/* 
  1. fs.stat  检测是文件还是目录(目录 文件是否存在) 
  2. fs.mkdir  创建目录 (创建之前先判断是否存在) 
  3. fs.writeFile  写入文件(文件不存在就创建,但不能创建目录) 
  4. fs.appendFile 写入追加文件 
  5.fs.readFile 读取文件 
  6.fs.readdir 读取目录 
  7.fs.rename 重命名 
  8. fs.rmdir  删除目录 
  9. fs.unlink 删除文件 
  同步方法在后面加上Sync, 比如fs.statSync
  14. fs.existsSync 判断路径是否存在
*/

var fs = require('fs'); // fs是node.js的核心模块,不用下载安装,可以直接引入  

// 1. fs.stat  检测是文件还是目录  fs.statSync()同步获取stats对象,通过返回值接收。
fs.stat('html', function (error, stats) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('文件:' + stats.isFile());
  console.log('目录:' + stats.isDirectory());
})


// 2. fs.mkdir  创建目录  
fs.mkdir('css', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('创建目录成功');
})


// 3. fs.writeFile  写入文件(会覆盖之前的内容)(文件不存在就创建)  utf8参数可以省略  
fs.writeFile('123.txt', '你好nodejs 覆盖', 'utf8', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('写入成功');
})


// 4. fs.appendFile 追加文件  
fs.appendFile('123.txt', '这是写入的内容\n', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('写入成功');
})


// 5.fs.readFile 读取文件  
fs.readFile('123.txt', function (error, data) {
  if (error) {
    console.log(error);
    return false;
  }
  // console.log(data);  // data是读取的十六进制的数据。  也可以在参数中加入编码格式"utf8"来解决十六进制的问题;
  console.log(data.toString()); // 读取出所有行的信息  
})


// 6.fs.readdir 读取目录下第一级内容  把目录下面的文件和文件夹都获取到。  
fs.readdir('html', function (error, data) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log(data); // data是数组类型,包含文件夹以及文件的名字(只有第一级目录内容)。拿到一个文件夹下面的所有目录  
})


// 7.fs.rename 重命名  1.改名  2.剪切文件(移动)  
fs.rename('html/index.html', 'html/news.html', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('修改名字成功');
})


// 8. fs.rmdir  删除目录   rmdir 这个方法只能删除目录,不能删除文件  
fs.rmdir('abc目录', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('删除目录成功');
})


// 9. fs.unlink删除文件  
fs.unlink('index.txt', function (error) {
  if (error) {
    console.log(error);
    return false;
  }
  console.log('删除文件成功');
})


// 10. fs.createReadStream  从文件流中读取数据,读取的文件比较大时建议用流的方式读取,文件比较大会多次读取。  
var fileReadStream = fs.createReadStream('data1.json');
var str = '';
fileReadStream.on('data', (data) => {
  console.log("接收到" + data.length); // 文件比较大时,会多次读取,多次执行该回调函数  
  str += data;
})
fileReadStream.on('end', () => {
  console.log(" --- 结束 ---");
  console.log(str);
})
fileReadStream.on('error', (error) => {
  console.log(error)
})


// 11. fs.createWriteStream  写入文件流  
var fs = require("fs");
var data = "我是从数据库获取的数据,我要保存起来";
var writerStream = fs.createWriteStream('output.txt');
writerStream.write(data, 'UTF8');
writerStream.end(); // 标记文件末尾  结束写入流,释放资源  
writerStream.on('finish', function () {
  console.log("写入完成。");
});
writerStream.on('error', function (error) {
  console.log(error.stack);
});
console.log("程序执行完毕");


// 12. pipe 管道流  
var fs = require("fs");
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
readerStream.pipe(writerStream);
console.log("程序执行完毕");


// 13. fs.access 判断目录、文件是否存在(读写权限)
var fs = require('fs');
fs.access('package.json', (err) => {
  console.log(err ? '目录/文件不存在' : '文件存在,可以进行读写');
});

// 14. fs.existsSync 判断路径是否存在, 存在返回 true, 否则返回 false
if (fs.existsSync('/etc/passwd')) {
  console.log('文件已存在');
}

var path = require('path');
/**
 * @deprecated 文件夹拷贝到某一个位置
 *
 * @param {String} src
 * @param {String} dest
 * @returns
 */
function CopyDirectory(src, dest) {
  if (!fs.existsSync(src)) {
    return false;
  }
  if (!fs.existsSync(dest)) {
    fs.mkdirSync(dest);
  }
  // 拷贝新的内容进去
  var dirs = fs.readdirSync(src);
  dirs.forEach(function (item) {
    var item_path = path.join(src, item);
    var temp = fs.statSync(item_path);
    if (temp.isFile()) { // 是文件
      fs.copyFileSync(item_path, path.join(dest, item));
    } else if (temp.isDirectory()) { // 是目录
      CopyDirectory(item_path, path.join(dest, item));
    }
  });
}


/**
 * @description 文件夹删除
 *
 * @param {String} dir
 */
function DeleteDirectory(dir) {
  if (fs.existsSync(dir) == true) {
    var files = fs.readdirSync(dir);
    files.forEach(function (item) {
      var item_path = path.join(dir, item);
      if (fs.statSync(item_path).isDirectory()) {
        DeleteDirectory(item_path);
      } else {
        fs.unlinkSync(item_path); // 删除文件
      }
    });
    fs.rmdirSync(dir); // 删除文件夹
  }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值