试图将父级内容复制到子级时抛出错误并进入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)
})
}
答案 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),检查它是否为列表,是否再次随机化。最后,将不冲突的名称保存在变量中并创建目录。
假设初始目录创建成功,您现在可以复制文件了。然后将文件夹移动到原始目标位置,可以选择在进程中将其重命名。如果在此过程中引发错误,则可能要考虑在引发异常或从函数返回之前,删除创建的临时目录及其内容。