使用 node 实现一个 copy 文件夹的函数

node 没有提供直接拷贝文件夹的 api, 下面使用现有的 fs 模块 api 实现一个 copy 文件夹的函数。

思路

通过
fs.copyFileSync() ,
fs.mkdirSync(),
fs.readdirSync()
递归实现拷贝文件夹。

代码:

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

//判断是否文件夹
function isFile(path) {
  return fs.statSync(path).isFile()
}

// copy 文件
function copyFile(src, dest) {
  const folderPath = path.parse(dest).dir
  // 文件夹是否存在
  if (!fs.existsSync(folderPath)) {
    // 不存在 (递归创建文件夹)
    fs.mkdirSync(folderPath, { recursive: true })
  }
  fs.copyFileSync(src, dest)
}

// copy 文件夹
function copyFolder(source, dest) {
  const sourcePath = path.resolve(source)
  const destPath = path.resolve(dest)
  // 原路径是否存在
  if (!fs.existsSync(sourcePath)) {
    return console.log('source path does not exist')
  }
  // 源路径存在
  // 判断源路径是否时文件
  if (isFile(sourcePath)) {
    // 是文件
    copyFile(sourcePath, destPath)
  } else {
    // 是文件夹
    fs.readdirSync(sourcePath)
      .forEach(item => {
        const fullPath = path.join(sourcePath, item)
        if (fs.statSync(fullPath).isFile()) {
          copyFile(fullPath, path.join(destPath, item))
        } else {
          // 文件夹 (进行递归)
          copyFolder(fullPath, path.join(destPath, item))
        }
      })
  }
}
/*
test

copyFolder('./foo', './demo')
// 或
copyFolder('C:\\Users\\foo', 'C:\\Users\\demo')
*/

module.exports = {
  copyFolder
}

测试

foo
 |--- bar
 |     |--- bar.js
 |--- foo.js

执行 copyFolder('./foo', './demo')

demo
 |--- bar
 |     |--- bar.js
 |--- foo.js

这样就简单实现了一个 copy 文件夹的 函数,这个 copyFolder 可能还有其它问题,没有细搞。

推荐 npm 包

cpr

fs-extra

posted @ 2021-05-21 11:45  暗恋桃埖源  阅读(458)  评论(0编辑  收藏  举报