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

时间:2020-10-02 15:37:42

标签: javascript node.js promise 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)
        })
     }

1 个答案:

答案 0 :(得分:1)

问题在于将目录的所有内容复制到子目录是递归调用。假设我尝试将目录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

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

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

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