在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 事件对象的实现
Jul 13 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
Oct 26 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
Aug 21 Javascript
jQuery不兼容input的change事件问题解决过程
Dec 05 Javascript
BootStrap智能表单实战系列(七)验证的支持
Jun 13 Javascript
JS动态给对象添加事件的简单方法
Jul 19 Javascript
Angular 1.x个人使用的经验小结
Jul 19 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
js数组方法reduce经典用法代码分享
Jan 07 Javascript
一文快速了解JQuery中的AJAX
May 31 jQuery
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
Jun 27 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
谈谈PHP语法(3)
2006/10/09 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
Python heapq使用详解及实例代码
2017/01/25 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
python实现猜数字游戏
2020/03/25 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
2014超市双十一活动策划方案
2014/09/29 职场文书
工资收入证明
2014/10/07 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
教育教学读书笔记
2015/07/02 职场文书
JS的深浅复制详细
2021/10/16 Javascript
JS函数式编程实现XDM一
2022/06/16 Javascript