如何使用nodejs fs将数据从一个目录复制到另一个目录?

How to copy data from one directory to another using nodejs fs?

试图将父内容复制到子内容并引发错误并进入 catch,知道我在这里做错了什么。

main.js

const fs = require('fs-extra');
const copyDirectories = function(data) {

        let destination = 'services/test2/tmp';
        let source = 'services/test2';
        fs.copy(source, destination)
        .then(() => console.log('Copy completed!'))
        .catch( err => {
            console.log('An error occured while copying the folder.')
            return console.error(err)
        })
     }

问题是将一个目录的所有内容复制到一个子目录是一个递归调用。假设我尝试将目录 a/ 的内容复制到 a/b/,然后文件 a/b/* 将被复制到 a/b/b/*,然后必须将其复制到 a/b/b/b/*等等

解决此问题的方法之一是先将内容复制到一个临时目录中。然后,复制完成后,将文件移回结构中。

此答案采用以下文件结构:

$ tree -F services
services
└── test2/
    ├── foo.txt
    └── tmp/

2 directories, 1 file
const fs = require('fs-extra');

const copyDirectories = async function(data) {
    const source = "services/test2";
    const destination = "services/test2/tmp";
    const tmp = "tmp-a11b23bsf3"; // <- assume randomized to not conflict

    await fs.mkdir(tmp);
    await fs.copy(source, tmp);
    await fs.move(tmp, destination, {overwrite: true});
};
$ tree -F services
services
└── test2/
    ├── foo.txt
    └── tmp/
        ├── foo.txt
        └── tmp/

3 directories, 2 files

请注意,这确实需要提供的临时目录不与现有目录冲突。

您可以通过首先在当前目录中检索 files/directories 的列表来避免可能的冲突。然后随机化一个文件名(例如使用uuid),检查它是否是列表,如果它再次随机化。最后将 non-conflicting 名称保存在变量中并创建目录。

假设初始目录创建成功,您现在可以复制文件了。然后将文件夹移动到原始目的地,可以选择在进程中重命名它。如果在此过程中抛出错误,您可能需要考虑在抛出异常或从函数返回之前删除创建的临时目录及其内容。