我正在尝试使用Node fs
模块复制文件夹。我熟悉readFileSync()
和writeFileSync()
方法,但我想知道我应该使用什么方法来复制指定的文件夹?
答案 0 :(得分:14)
您可以使用fs-extra将一个文件夹的内容复制到另一个文件夹
var fs = require("fs-extra");
fs.copy('/path/to/source', '/path/to/destination', function (err) {
if (err) return console.error(err)
console.log('success!')
});
还有一个同步版本。
答案 1 :(得分:2)
仅用10行本机节点函数就可以节省额外的依赖性
添加以下copyDir
函数:
const { promises: fs } = require("fs")
const path = require("path")
async function copyDir(src, dest) {
await fs.mkdir(dest, { recursive: true });
let entries = await fs.readdir(src, { withFileTypes: true });
for (let entry of entries) {
let srcPath = path.join(src, entry.name);
let destPath = path.join(dest, entry.name);
entry.isDirectory() ?
await copyDir(srcPath, destPath) :
await fs.copyFile(srcPath, destPath);
}
}
然后像这样使用:
copyDir("./inputFolder", "./outputFolder")
fsPromises.copyFile
(已添加到v10.11.0
中) fsPromises.readdir
(已添加到v10.0
中) fsPromises.mkdir
(已添加到v10.0
中) 答案 2 :(得分:1)
这是@KyleMit answer的同步版本
copyDirectory(source, destination) {
fs.mkdirSync(destination, { recursive: true });
fs.readdirSync(source, { withFileTypes: true }).forEach((entry) => {
let sourcePath = path.join(source, entry.name);
let destinationPath = path.join(destination, entry.name);
entry.isDirectory()
? copyDirectory(sourcePath, destinationPath)
: fs.copyFileSync(sourcePath, destinationPath);
});
}
答案 3 :(得分:1)
我喜欢 KyleMit's answer,但认为并行版本会更可取。
代码在 TypeScript 中。如果您需要 JavaScript,只需删除 : string
声明行上的 copyDirectory
类型注释。
import { promises as fs } from "fs"
import path from "path"
export const copyDirectory = async (src: string, dest: string) => {
const [entries] = await Promise.all([
fs.readdir(src, { withFileTypes: true }),
fs.mkdir(dest, { recursive: true }),
])
await Promise.all(
entries.map((entry) => {
const srcPath = path.join(src, entry.name)
const destPath = path.join(dest, entry.name)
return entry.isDirectory()
? copyDirectory(srcPath, destPath)
: fs.copyFile(srcPath, destPath)
})
)
}
答案 4 :(得分:0)
您可能需要查看ncp包。它完全符合你的努力;递归地将文件从路径复制到另一个路径。
这是让你开始的事情:
const fs = require("fs");
const path = require("path");
const ncp = require("ncp").ncp;
// No limit, because why not?
ncp.limit = 0;
var thePath = "./";
var folder = "testFolder";
var newFolder = "newTestFolder";
ncp(path.join(thePath, folder), path.join(thePath, newFolder), function (err) {
if (err) {
return console.error(err);
}
console.log("Done !");
});
答案 5 :(得分:0)
有一个优雅的语法。您可以使用pwd-fs模块。
const FileSystem = require('pwd-fs');
const pfs = new FileSystem();
async () => {
await pfs.copy('./path', './dest');
}