在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 相关文章推荐
再探JavaScript作用域
Sep 24 Javascript
在JavaScript中使用JSON数据
Feb 15 Javascript
javascript每日必学之继承
Feb 23 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
微信小程序 跳转传递数据的实例
Jul 06 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
socket io与vue-cli的结合使用的示例代码
Nov 01 Javascript
VUE v-model表单数据双向绑定完整示例
Jan 21 Javascript
夯基础之手撕javascript继承详解
Nov 09 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
Dec 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
如何利用php+mysql保存和输出文件
2006/10/09 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
python烟花效果的代码实例
2020/02/25 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
读书活动总结
2014/04/28 职场文书
学习演讲稿范文
2014/05/10 职场文书
建筑工地文明标语
2014/10/09 职场文书
捐助感谢信
2015/01/22 职场文书
python xlwt模块的使用解析
2021/04/13 Python