节点fs复制文件夹

时间:2016-08-23 16:35:17

标签: node.js fs

我正在尝试使用Node fs模块复制文件夹。我熟悉readFileSync()writeFileSync()方法,但我想知道我应该使用什么方法来复制指定的文件夹?

6 个答案:

答案 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")

进一步阅读

答案 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');
}