【问题标题】:How to copy data from one directory to another using nodejs fs?如何使用nodejs fs将数据从一个目录复制到另一个目录?
【发布时间】:2021-01-18 07:11:13
【问题描述】:

试图将父内容复制到子错误并进入 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)
        })
     }

【问题讨论】:

  • 错误信息是什么?
  • 可能目的地不能在源内部,因为这可能会造成复制的无限循环。
  • 刚刚运行提供的代码,错误消息是“错误:无法将'services/test2'复制到自身的子目录'services/test2/tmp'。”
  • @3limin4t0r 那么我们如何将父目录复制到子目录,还有其他方法吗?
  • @hussain 先将文件复制到不是子目录的目录,然后将临时位置移动到原始目标位置。

标签: javascript node.js promise fs


【解决方案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),检查它是否是列表,是否再次随机化。最后将不冲突的名称保存在变量中并创建目录。

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

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2012-02-15
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2020-06-22
    相关资源
    最近更新 更多