在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实现仿银行密码输入框效果的代码
Dec 13 Javascript
扩展jQuery 键盘事件的几个基本方法
Oct 30 Javascript
javascript右下角弹层及自动隐藏(自己编写)
Nov 20 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
JavaScript获取页面中超链接数量的方法
Nov 09 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
Apr 07 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 Javascript
react国际化react-intl的使用
May 06 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
memcache命令启动参数中文解释
2014/01/13 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python中as用法实例分析
2015/04/30 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
GWebs公司笔试题
2012/05/04 面试题
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
科学育儿宣传标语
2014/10/08 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
用人单位聘用意向书
2015/05/11 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers