在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 相关文章推荐
判断滚动条到底部的JS代码
Nov 04 Javascript
html+js实现简单的计算器代码(加减乘除)
Jul 12 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
Sep 06 Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 Javascript
解析Vue.js中的组件
Feb 02 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
深入Node TCP模块的理解
Mar 13 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
Apr 28 Javascript
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
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 遍历文件实现代码
2011/05/04 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
python利用sklearn包编写决策树源代码
2017/12/21 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python爬虫实例详解
2018/06/19 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
心得体会范文
2014/01/04 职场文书
制作部班长职位说明书
2014/02/26 职场文书
村党支部公开承诺书
2014/05/29 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers