在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 相关文章推荐
Extjs学习笔记之六 面版
Jan 08 Javascript
不同浏览器对回车提交表单的处理办法
Feb 13 Javascript
javascript getElementsByClassName函数
Apr 01 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
Apr 13 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
js实现可折叠展开的手风琴菜单效果
Sep 07 Javascript
jquery实现简洁文件上传表单样式
Nov 02 Javascript
关于JavaScript限制字数的输入框的那些事
Aug 14 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
Three.js利用顶点绘制立方体的方法详解
Sep 27 Javascript
优雅的elementUI table单元格可编辑实现方法详解
Dec 23 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随机数生成代码与使用实例分析
2011/04/08 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
基于jquery的时间段实现代码
2012/08/02 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
python 图片验证码代码分享
2012/07/04 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Python配置文件处理的方法教程
2019/08/29 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
wxPython实现文本框基础组件
2019/11/18 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
闪闪的红星观后感
2015/06/08 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers