在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 相关文章推荐
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
May 08 Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 Javascript
jQuery应用之jQuery链用法实例
Jan 19 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
js实现类似MSN提示的页面效果代码分享
Aug 24 Javascript
Webpack 实现 AngularJS 的延迟加载
Mar 02 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
node.js的事件机制
Feb 08 Javascript
详解Node.js实现301、302重定向服务
Apr 07 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
Aug 25 Javascript
微信小程序如何实现五星评价功能
Oct 15 Javascript
详解Vue中的Props与Data细微差别
Mar 02 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
Oracle 常见问题解答
2006/10/09 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
php实现简单的上传进度条
2015/11/17 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
selenium 安装与chromedriver安装的方法步骤
2019/06/12 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
校长先进事迹材料
2014/02/01 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
小学家长意见怎么写
2015/06/03 职场文书