nodejs 使用关键字yield 纯异步文件夹复制2.0

3 篇文章 0 订阅

首先现在安装yflow 

 yflow 借助es6 生成器函数来解决金字塔回调问题。

这个连接

http://faylai.iteye.com/blog/1924523

是我先前使用async 做的但是代码超长不好理解,写做困难。

比较下面的实现简直就是nodejs的曙光啊

---------------------------------------------------------------------------

 

首先安装 yflow 组建 :npm install yflow

 

 

var yflow = require("yflow");
var FS = require("fs");
var fs = yflow.wrap(FS);
var path = require("path");
// 检测文件或者文件夹是否存在
var isExists = yflow.wrap(function (dir, cb) {
		FS.exists(dir, function (isExist) {
			cb(null, isExist);
		});
	});
// 创建多级目录
function mkdirs(p, mode, f, made) {
	if (typeof mode === 'function' || mode === undefined) {
		f = mode;
		mode = 0777 & (~process.umask());
	}
	if (!made) {
		made = null;
	}
	var cb = f || function () {};
	if (typeof mode === 'string') {
		mode = parseInt(mode, 8);
	}
	yflow(
		function  * () {
		p = path.resolve(p);
		var startDir = p;
		while (true) {
			var exist = yield isExists(startDir);
			if (exist) {
				break;
			} else {
				startDir = path.dirname(startDir);
			}
		}
		var slashees = p.split(startDir)[1].split(path.sep);
		for (var i = 0; i < slashees.length; i++) {
			var slashee = slashees[i].trim();
			if (slashee != '') {
				startDir = path.join(startDir, slashee);
				yield fs.mkdir(startDir, mode);
			}
		}

	})(f)
}
// 单个文件复制
function copyFile(file, toDir, cb) {
	yflow(function  * () {
		yield yflow.wrap(mkdirs)(toDir);
		var reads = FS.createReadStream(file);
		var writes = FS.createWriteStream(path.join(path.resolve(toDir), path.basename(file)));
		reads.pipe(writes);
		reads.on("end", function () {
			writes.end();
		});
	})(cb);
}
//文件夹复制
function copyDir(from, to, cb) {
	yflow(function  * () {
		var stat = yield isExists(from);
		stat = yield fs.stat(from);
		if (stat.isFile()) {
			yield yflow.wrap(copyFile)(from, to);
		} else if (stat.isDirectory) {
			var files = yield fs.readdir(from);
			for (var i = 0; i < files.length; i++) {
				var newFile = path.join(from, files[i]);
				stat = yield fs.stat(newFile);
				if (stat.isFile()) {
					yield yflow.wrap(copyFile)(newFile, to);
				} else if (stat.isDirectory()) {
					yield yflow.wrap(copyDir)(newFile, path.join(to, files[i]));
				}
			}
		}
	})(cb);
}

 

 

   测试代码如下:

  

copyDir("F:\\jar", "F:\\jar2", function (e) {
	if (e) {
		console.log(e.stack);
	} else {
		console.log("copy ok!");
	}
})

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 `fs` 模块的 `readdirSync` 和 `readFileSync` 方法来实现这个功能。 首先,使用 `readdirSync` 方法读取文件夹中的文件列表: ``` const fs = require('fs'); const path = require('path'); const directoryPath = path.join(__dirname, 'data'); const files = fs.readdirSync(directoryPath); ``` 然后,你可以使用 `for` 循环遍历文件列表,对每个文件使用 `readFileSync` 方法读取内容: ``` for (const file of files) { const filePath = path.join(directoryPath, file); const fileContent = fs.readFileSync(filePath, 'utf-8'); console.log(fileContent); } ``` 你还可以使用 `JSON.parse` 方法将文件内容解析为 JSON 对象: ``` for (const file of files) { const filePath = path.join(directoryPath, file); const fileContent = fs.readFileSync(filePath, 'utf-8'); const data = JSON.parse(fileContent); console.log(data); } ``` 希望这些信息能帮到你! ### 回答2: 使用Node.js中的`readFileSync`方法可以同步地读取文件内容。要读取data文件夹中的所有json文件,可以通过以下步骤实现: 1. 首先,导入Node.js的`fs`模块,该模块提供了文件系统相关的功能。 ```javascript const fs = require('fs'); ``` 2. 创建一个文件夹路径的变量,指向data文件夹的路径。 ```javascript const folderPath = './data'; ``` 3. 使用`fs.readdirSync`方法读取data文件夹中的所有文件,并过滤出后缀名为`.json`的文件。 ```javascript const jsonFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.json')); ``` 4. 遍历jsonFiles数组,对每个json文件使用`readFileSync`方法读取文件内容。 ```javascript const jsonData = []; jsonFiles.forEach(file => { const filePath = `${folderPath}/${file}`; const fileData = fs.readFileSync(filePath, 'utf8'); const json = JSON.parse(fileData); jsonData.push(json); }); ``` 5. 最终,jsonData数组中包含了data文件夹中所有json文件的内容。 完整代码如下: ```javascript const fs = require('fs'); const folderPath = './data'; const jsonFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.json')); const jsonData = []; jsonFiles.forEach(file => { const filePath = `${folderPath}/${file}`; const fileData = fs.readFileSync(filePath, 'utf8'); const json = JSON.parse(fileData); jsonData.push(json); }); console.log(jsonData); ``` 请注意,以上代码假设data文件夹中的所有json文件的内容都是有效的JSON格式,否则在解析时可能会出现错误。 ### 回答3: 使用Node.js的readFileSync方法读取data文件夹中的所有JSON文件可以通过以下步骤完成: 1. 首先,需要引入Node.js的fs模块,该模块是用于文件操作的核心模块,可以使用以下语句引入: ``` const fs = require('fs'); ``` 2. 接下来,使用`fs.readdirSync()`方法读取data文件夹的内容,该方法返回一个包含文件名的数组,可以使用以下语句获取data文件夹中的所有文件名: ``` const fileNames = fs.readdirSync('./data'); ``` 3. 接下来,可以使用for循环遍历文件名数组,并使用`fs.readFileSync()`方法读取每个文件的内容。可以使用以下代码片段来实现: ``` fileNames.forEach((fileName) => { if (fileName.endsWith('.json')) { const filePath = `./data/${fileName}`; const fileContent = fs.readFileSync(filePath, 'utf-8'); const jsonData = JSON.parse(fileContent); // 对读取到的JSON数据进行后续处理 // ... } }); ``` 在以上代码中,首先判断文件名是否以`.json`结尾,以排除其他非JSON文件。然后构造文件的完整路径,使用`fs.readFileSync()`方法按照utf-8格式读取文件内容,并使用`JSON.parse()`方法将读取到的文件内容解析为JSON对象进行后续处理。 请注意,以上代码假设data文件夹与当前代码文件在同一目录下。如果data文件夹的路径不同,需要相应修改`readdirSync()`方法中的路径参数和`readFileSync()`方法中的文件路径参数。 最后,根据具体需求,在上述代码的基础上,可以继续根据JSON数据进行后续操作,如解析、处理、存储等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值