在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生成缩略图后上传并利用canvas重绘
May 15 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
Jun 23 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
May 16 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 Javascript
JS如何设置iOS中微信浏览器的title
Nov 22 Javascript
Angular的$http的ajax的请求操作(推荐)
Jan 10 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
详解基于vue的移动web app页面缓存解决方案
Aug 03 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
Jan 09 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用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
vue组件生命周期详解
2017/11/07 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python斐波那契数列的计算方法
2018/09/27 Python
Python中文编码知识点
2019/02/18 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python实现局域网内实时通信代码
2019/12/22 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
致跳远、跳高运动员广播稿
2014/01/09 职场文书
委托书样本
2014/04/02 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
作文批改评语
2014/12/25 职场文书
在职证明书模板
2015/06/15 职场文书
小学运动会通讯稿
2015/07/18 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP