通过node将一个文件夹中的所有文件复制到另外一个文件夹中

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


一、node的核心模块

主要介绍node的path模块,fs模块。
实现案例:通过path+fs模块实现复制文件夹里面的所有内容到另外一个文件

1.path模块

1.1.从路径中获取信息

  • dirname 获取文件的父文件夹
  • basename 获取文件名
  • extname 获取文件的扩展名

代码如下(示例):

const path = require('path')

const filepath = '/User/why/abc.txt';   //模拟路径
//获取路径中的父级文件夹 dirname
console.log(path.dirname(filepath));     //   /User/why
//获取路径中文件名 basename
console.log(path.basename(filepath));   //	  abc.txt
//获取路径中的扩展名
console.log(path.extname(filepath));	//	  .txt

1.2.路径拼接

  • path.join() 多个路径进行拼接
  • path.resolve() 会判断我们拼接的路径前面是否有 /或…/或./;有的话会解析成绝对路径

代码如下(示例):

// 1.join路径拼接
const path = require('path')

const basepath = '../User/why';
const filename = './abc.txt';
const filepath1 = path.join(basepath, filename);
console.log(filepath1);   // ..\User\why\abc.txt

//2.resolve路径拼接
// resolve会判断拼接的路径字符串中,是否有以/或./或../开头的路径
const filepath2 = path.resolve(basepath, filename);
console.log(filepath2);
//  1. (../开头)会先找到相对于该文件的上级目录的绝对路径
//  2. (绝对路径)F:\node\学习\code\01_learn-node\05_常见的内置模块
//  3. 拼接 F:\node\学习\code\01_learn-node\05_常见的内置模块 + /User/why + abc.txt  (最终结果)
//  F:\node\学习\code\01_learn-node\05_常见的内置模块\User\why\abc.txt

总结:join方法只会进行路径拼接不会解析成绝对路径,而resolve方法会解析成绝对路径后在进行拼接

2.fs模块

  • fs.statSync 读取文件信息(大小,创建时间等等)不加sync为异步调用采用回调函数接收文件信息
  • fs.writeFile 文件的写入
  • fs.readFile 文件的读取
  • fs.mkdir 创建文件夹
  • fs.readdir 文件夹的读取
  • fs.copyFileSync 文件的复制

代码如下(示例):

  • 示例fs.stat
//引入fs模块
const fs = require('fs');
//先在当前文件夹下创建一个abc.txt文件   (省略目录结构截图)
// 案例: 读取文件的信息
const filepath = "./abc.txt";     

// 1.方式一: 同步操作
const info = fs.statSync(filepath);
console.log("后续需要执行的代码");
console.log(info);
// 2.方式二: 异步操作
// fs.stat(filepath, (err, info) => {
//   if (err) {
//     console.log(err);
//     return;
//   }
//   console.log(info);
//   console.log(info.isFile());
//   console.log(info.isDirectory());
// });
// console.log("后续需要执行的代码");

//结果:包括文件大小,创建时间
Stats {
  dev: 168626483,
  mode: 33206,   
  nlink: 1,      
  uid: 0,        
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 1125899906960302,
  size: 41,
  blocks: 0,
  atimeMs: 1658990688875.9424,
  mtimeMs: 1602856031000,
  ctimeMs: 1656482928212.2583,
  birthtimeMs: 1656482928211.2617,
  atime: 2022-07-28T06:44:48.876Z,
  mtime: 2020-10-16T13:47:11.000Z,
  ctime: 2022-06-29T06:08:48.212Z,
  birthtime: 2022-06-29T06:08:48.211Z
}
  • 示例 fs.writeFile && fs.readFile
//1.文件写入
const fs = require('fs');
//先在当前目录下创建一个abc.txt文件   (省略目录结构截图)
// 案例: 文件的读写
const content = "你好,小明";

//flag:"a"  为追加文件内容不是覆盖原有的文件内容
fs.writeFile('./abc.txt', content, {flag: "a"}, err => {
  console.log(err);
});
// 结果:在bac.txt文件中添加了 "你好,小明"

//2.文件读取
//采用utf-8的字符编码进行读文件
fs.readFile("./abc.txt", {encoding: 'utf-8'}, (err, data) => {
  console.log(data);	// "你好,小明"
});
  • 示例 fs.mkdir && fs.readdir
 const fs = require('fs');
const path = require('path');

// 1.创建文件夹
const dirname = './newDir';  //在当前文件夹下创建一个newDir文件夹
if (!fs.existsSync(dirname)) {		//判断文件夹是否已经存在
    fs.mkdir(dirname, err => {		//创建文件夹
    console.log(err);
   });
}

//2读文件夹
//加{withFileTypeS:true} 会返回数组对象,对象包含文件夹里面的每个文件的信息,如果不写的话只能拿到数组,数组每一项是文件名
 fs.readdir(dirname, { withFileTypes: true }, (err, files) => {
    for (let file of files) {
    	console.log(file.name)
    }

练习案例

  • 目标:将oldFile文件夹里面的所有东西复制一份到新的newFile文件夹中

完成前的目录结构
在这里插入图片描述
完成后的目录结构
在这里插入图片描述

代码如下(示例):

//导入核心模块
const path = require('path')
const fs = require('fs')

//获取到
let newFilePath = path.resolve(__dirname,'newFile')
let oldFilePath = path.resolve(__dirname,'oldFile')

//判断新目录下面是否存在newFile文件夹,不存在就创建一个newFile文件夹
if(!fs.existsSync(newFilePath)){
  fs.mkdir(newFilePath ,err=>{
    // console.log(err)
  })
}
//递归 (文件夹套文件夹)的结构,直到拿到文件为止

const path = require('path')
const fs = require('fs')

// 获取oldFile文件夹,newFile的绝对路径
let OriginFilePath = path.resolve(__dirname,'oldFile')
let CopyFilePath = path.resolve(__dirname,'newFile')

//判断要创建的文件夹(newFile)是否存在,不存在就创建一个
if(!fs.existsSync(CopyFilePath)){
  fs.mkdir(CopyFilePath,err=>{
    // console.log(err)
  })
}
//传入路径
getFiles(OriginFilePath,CopyFilePath)
function getFiles(OriginFilePath,CopyFilePath){
//读取newFile文件夹下的文件
  fs.readdir(OriginFilePath,{withFileTypes:true},(err,files)=>{
      for(let file of files){
      	//判断是否是文件夹,不是则直接复制文件到newFile中
        if(!file.isDirectory()){
         //获取旧文件夹中要复制的文件
          const OriginFile = path.resolve(OriginFilePath,file.name)
          //获取新文件夹中复制的地方
          const CopyFile = path.resolve(CopyFilePath,file.name)
          //将文件从旧文件夹复制到新文件夹中
          fs.copyFileSync(OriginFile,CopyFile) 
        }else{//如果是文件夹就递归变量把最新的文件夹路径传过去
          const CopyDirPath = path.resolve(CopyFilePath,file.name)
          const OriginDirPath = path.resolve(OriginFilePath,file.name)
          fs.mkdir(CopyDirPath,(err)=>{
      
          })
          // OriginFilePath = OriginPath
          // CopyFilePath = DirPath
          getFiles(OriginDirPath,CopyDirPath)
        }
      }
  })
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值