在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与Prototype并存的冲突的解决方法
Aug 29 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
Vue.js实现大转盘抽奖总结及实现思路
Oct 09 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 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
3种平台下安装php4经验点滴
2006/10/09 PHP
php动态生成函数示例
2014/03/21 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python清除函数占用的内存方法
2018/06/25 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
python实现对输入的密文加密
2019/03/20 Python
python计算导数并绘图的实例
2020/02/29 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
教师实习自我鉴定
2013/12/13 职场文书
政工例会汇报材料
2014/08/26 职场文书
工作总结与自我评价
2014/09/18 职场文书
学校开学标语
2014/10/06 职场文书
大一学生个人总结
2015/02/15 职场文书
学校中秋节活动总结
2015/03/23 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
五年级数学教学反思
2016/02/16 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python