在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 相关文章推荐
jQuery源码分析-04 选择器-Sizzle-工作原理分析
Nov 14 Javascript
得到form下的所有的input的js代码
Nov 07 Javascript
JavaScript将取代AppleScript?
Sep 18 Javascript
js获取UserControl内容为拼html时提供方便
Nov 02 Javascript
javascript手工制作悬浮菜单
Feb 12 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
JS及JQuery对Html内容编码,Html转义
Feb 17 Javascript
node文字生成图片的示例代码
Oct 26 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
angular6 填坑之sdk的方法
Dec 27 Javascript
微信小程序定义和调用全局变量globalData的实现
Nov 01 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 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 Ajax中文乱码问题解决方法
2009/02/27 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
浅析PHP绘图技术
2013/07/03 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
Numpy之reshape()使用详解
2019/12/26 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
现代化办公人员工作的自我评价
2013/10/16 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
产品委托授权书范本
2014/09/16 职场文书
2014年环卫工作总结
2014/11/22 职场文书
学生检讨书范文
2015/01/27 职场文书
mysql部分操作
2021/04/05 MySQL
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技