在Node.js中实现文件复制的方法和实例


Posted in Javascript onJune 05, 2014

Node.js 本身并没有提供直接复制文件的 API,如果想用 Node.js 复制文件或目录,需要借助其他的 API 来实现。复制单个的文件可以直接用 readFile、writeFile,这样比较简便。如果是复制一个目录下的所有文件,目录下可能还包含了子目录,那么此时就需要用到更高级点的 API 了。

流是 Node.js 移动数据的方式,Node.js 中的流是可读/可写的,HTTP 和文件系统模块都有用到流。在文件系统中,使用流来读取文件的时候,对于一个大文件可能并不会一次性读取完,而是会分好几次读取完,读取的时候会响应数据事件,在文件没读取完的时候就可以对读取的数据进行操作。同理,在写入流的时候也和读取时一样,大文件并不会一次性写入。这种移动数据的方式是非常高效的,尤其是对于大文件而言,使用流比等待将大文件全部读取完再来操作文件要快得多。

管道

如果想在读取流和写入流的时候做完全的控制,可以使用数据事件。但对于单纯的文件复制来说读取流和写入流可以通过管道来传输数据。

实际应用:

var fs = require( 'fs' ),
    stat = fs.stat;/*
 * 复制目录中的所有文件包括子目录
 * @param{ String } 需要复制的目录
 * @param{ String } 复制到指定的目录
 */
var copy = function( src, dst ){
    // 读取目录中的所有文件/目录
    fs.readdir( src, function( err, paths ){
        if( err ){
            throw err;
        }

        paths.forEach(function( path ){
            var _src = src + '/' + path,
                _dst = dst + '/' + path,
                readable, writable;        
            stat( _src, function( err, st ){
                if( err ){
                    throw err;
                }
                // 判断是否为文件
                if( st.isFile() ){
                    // 创建读取流
                    readable = fs.createReadStream( _src );
                    // 创建写入流
                    writable = fs.createWriteStream( _dst );   
                    // 通过管道来传输流
                    readable.pipe( writable );
                }
                // 如果是目录则递归调用自身
                else if( st.isDirectory() ){
                    exists( _src, _dst, copy );
                }
            });
        });
    });
};
// 在复制目录前需要判断该目录是否存在,不存在需要先创建目录
var exists = function( src, dst, callback ){
    fs.exists( dst, function( exists ){
        // 已存在
        if( exists ){
            callback( src, dst );
        }
        // 不存在
        else{
            fs.mkdir( dst, function(){
                callback( src, dst );
            });
        }
    });
};
// 复制目录
exists( './src', './build', copy );
Javascript 相关文章推荐
javascript 控制弹出窗口
Apr 10 Javascript
javascript textContent与innerText的异同分析
Oct 22 Javascript
JavaScript起点(严格模式深度了解)
Jan 28 Javascript
JavaScript中具名函数的多种调用方式总结
Nov 08 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
浅谈Javascript中substr和substring的区别
Sep 30 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
Jul 13 Javascript
javascript移动设备Web开发中对touch事件的封装实例
Jun 05 #Javascript
删除条目时弹出的确认对话框
Jun 05 #Javascript
判断复选框是否被选中的两种方法
Jun 04 #Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 #Javascript
JS替换字符串中字符即替换全部而不是第一个
Jun 04 #Javascript
ActiveX控件与Javascript之间的交互示例
Jun 04 #Javascript
使用jquery修改表单的提交地址基本思路
Jun 04 #Javascript
You might like
基于empty函数的输出详解
2013/06/17 PHP
请离开include_once和require_once
2013/07/18 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python urlopen 使用小示例
2008/09/06 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
关于.NET, HTML的五个问题
2012/08/29 面试题
大专生自荐信
2013/10/04 职场文书
四年级下册教学反思
2014/02/01 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
同学会主持词
2014/03/18 职场文书
物业管理专业自荐信
2014/07/01 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
父亲节寄语大全
2015/02/27 职场文书
2015年环境整治工作总结
2015/05/22 职场文书