在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程序之undefined篇(中)
Nov 23 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
Apr 25 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
javascript仿qq界面的折叠菜单实现代码
Dec 12 Javascript
js动态创建及移除div的方法
Jun 03 Javascript
基于javascript实现彩票随机数生成(升级版)
Apr 17 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
Jul 27 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
Dec 21 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
Webpack的dll功能使用
Jun 28 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写的简单留言本实例代码
2008/07/25 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
详解Python中DOM方法的动态性
2015/04/11 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python虚拟环境项目实例
2017/11/20 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
学python需要去培训机构吗
2020/07/01 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
女子职高个人自荐书
2014/02/01 职场文书
锦旗标语大全
2014/06/23 职场文书
医学专业大学生求职信
2014/07/12 职场文书
社区服务活动报告
2015/02/05 职场文书
语文教师个人工作总结
2015/02/06 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS