这篇文章主要介绍了在Node.js中实现文件复制的方法和实例,使用FS模块实现,需要的朋友可以参考下

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 );

最新资讯
库克看好远程办公:苹果不会“回到过去的样子”

库克看好远程办公:苹果

苹果首席执行官蒂姆·库克(Tim Cook)称,员工远程工作的能
5G时代会有何生态变迁?智能应用愈丰但安全挑战加剧|新浪5G峰会

5G时代会有何生态变迁

在生态变迁分论坛上,奇安信董事长齐向东、完美世界CEO
苏宁收购家乐福中国一周年 张近东:家乐福的本土竞争力更强了

苏宁收购家乐福中国一

张近东认为,零售业已进入全场景时代,传统的卖场数字化转
立法者突然造访亚马逊仓库 对其员工保护提出质疑

立法者突然造访亚马逊

据报道,两名来自美国密歇根州的议员在参观了亚马逊公司
理想汽车将在全尺寸SUV采用NVIDIA自动驾驶智能芯片ORIN

理想汽车将在全尺寸SU

理想汽车与人工智能计算公司NVIDIA及NVIDIA中国合作伙
人送绰号「行走避雷针」,我长颈鹿绝非浪得虚名!

人送绰号「行走避雷针

今年早些时候,南非的环保主义者们发现两头长颈鹿被雷劈
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,