在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操作select下拉列表框的代码
Jun 04 Javascript
jQuery UI AutoComplete 使用说明
Jun 20 Javascript
js+jquery实现图片裁剪功能
Jan 02 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
javascript模拟评分控件实现方法
May 13 Javascript
js正则表达式注册页面表单验证
Oct 11 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
jquery实现左右滑动式轮播图
Mar 02 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
Apr 13 Javascript
Bootstrap实现可折叠分组侧边导航菜单
Mar 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
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
理解JS绑定事件
2016/01/19 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
简单了解JS打开url的方法
2020/02/21 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
python之文件读取一行一行的方法
2018/07/12 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
python文字转语音实现过程解析
2019/11/12 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
美国温暖商店:The Warming Store
2018/12/15 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
SQL Server数据库笔试题和答案
2016/02/04 面试题
介绍一下Linux文件的记录形式
2012/04/18 面试题
领导班子“四风问题”“整改方案
2014/10/02 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技