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
可能还有其它问题,没有细搞。