`
faylai
  • 浏览: 78217 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

nodejs 使用关键字yield 纯异步文件夹复制2.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!");
	}
})

 

分享到:
评论

相关推荐

    nodejs实现遍历文件夹并统计文件大小

    实现遍历文件夹功能的代码中,使用了`fs.readdirSync`方法,该方法同步读取目录内容,并返回一个文件名的数组。通过递归调用`readFile`函数,程序能够深入到每一个子目录中继续遍历,对于每一个文件,程序会使用`fs....

    Nodejs让异步变成同步的方法

    2. yield关键字:在生成器函数中使用yield关键字可以暂停函数的执行,并且可以配合Promise使用,等待异步操作完成后再恢复执行。 3. Promise:Promise对象代表一个最终可能完成也可能失败的异步操作,提供了一种...

    nodeJS 抽离 遍历 文件夹下的所有压缩包

    nodeJS 抽离 遍历 文件夹下的所有压缩包。也可以抽离遍历指定类型的文件

    纯异步nodejs文件夹(目录)复制功能

    在Node.js环境中,实现纯异步的文件夹(目录)复制功能是一项常见的任务,尤其在构建文件系统操作或数据迁移的场景中。本篇将详细讲解如何使用纯异步方式来复制一个目录及其内容。 首先,我们需要理解Node.js中处理...

    nodejs文件夹深层复制功能

    在Node.js环境中,有时我们需要处理文件系统的操作,例如复制整个文件夹及其子文件夹中的所有内容。本篇文章主要探讨如何实现Node.js中的文件夹深层复制功能。在实际开发中,这种功能可以应用于备份、迁移或者处理多...

    一个文件夹解决nvm和nodejs

    标题中的“一个文件夹解决nvm和node.js”指的是如何在一个文件夹中同时管理NVM(Node Version Manager)和Node.js的多个版本。NVM是一个非常实用的工具,尤其对于开发者来说,它允许你在同一台计算机上安装和切换...

    nodejs异步上传

    这个例子展示了如何使用jQuery FileUpload和Node.js的formidable实现异步文件上传,并在客户端实时显示上传进度。通过这种方式,用户可以一边上传大文件,一边进行其他操作,提高了Web应用的交互性。记得在实际项目...

    auto-keywords:从文本为nodejs生成关键字

    从文本中提取关键字 使用它: npm install auto-keywords var extract = require('auto-keywords'); var keywords = extract('your text here');

    NodeJs使用mongoose操作mongodb

    Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具。 本资源代码配合博客使用:https://blog.csdn.net/qq_25479327/article/details/81148772 NodeJs使用mongoose操作mongodb

    Node.js-使用node.js实现OAuth2.0的一个非常简单的演示

    在本教程中,我们将探讨如何使用 Node.js 实现 OAuth2.0 的基本流程。 首先,我们需要了解 OAuth2.0 的四个主要角色:资源所有者(Resource Owner)、客户端(Client)、资源服务器(Resource Server)和授权服务器...

    Thinkjs 单图片异步上传demo v2.0

    v2.0基于thinkjs的图片异步上传demo,包括上传、展示、编辑、删除使用本产品需要以下知识//down.chinaz.com/soft/36581.htm添加会员功能,或者更改上传插件为批量上传安装:1 安装nodejs、thinkjs2 把解压后根目录的...

    Nodejs 复制文件/文件夹的方法

    除了使用fs模块的方法外,还可以通过执行系统的cp命令来复制文件或文件夹。通过child_process模块中的spawn函数,可以创建一个新的进程来执行shell命令。这里以复制文件为例,使用cp命令实现: ```javascript const ...

    将异步JavaScript函数转变成ES6生成器以便在他们可以在现代浏览器在nodejs中使用

    2. **使用生成器重构**:创建一个新的生成器函数,使用`yield`表达式来表示异步操作。这些`yield`表达式通常会返回一个Promise,这样生成器就可以在Promise解决或拒绝时暂停和恢复。 3. **协调生成器**:为了驱动...

    nodejs实现OAuth2.0授权服务认证

    OAuth是一种开发授权的网络标准,全拼为open authorization,即开放式授权,最新的协议版本是2.0。 举个栗子: 有一个”云冲印”的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让”云...

    NodeJs通过async/await处理异步的方法

    我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数。我们来模拟一个Mongo数据库的操作,感受一下。 mongoDb.open...

    nodejs判断文件、文件夹是否存在及删除的方法

    在Node.js中,我们可以使用`fs`模块的`exists()`方法来检查文件或文件夹是否存在。这个方法接受一个文件或目录的路径作为参数,以及一个回调函数。当文件或目录存在时,回调函数会接收到`true`;反之,如果不存在,...

    nodejs文件位于nodejs文件夹中,部署在云端;nodejsmysql文件是Android的

    nodejs文件位于nodejs文件夹中,部署在云端;nodejsmysql文件是Android的部分源代码,apk可以安装在手机上。一个简单的应用程序,主要帮助了解如何使用云服务器以及如何连接到它们

Global site tag (gtag.js) - Google Analytics