使用fs-extra的moveSync移动目录时报dest already exists错误
问题根因
报错是遍历顺序和fs-extra的目录创建规则共同导致的:
- 你当前的遍历顺序先处理了带
subModel: 'assignments'的条目,fs.moveSync默认会递归创建不存在的目标父目录,这一步会提前创建空的/pages/consultants目录,再把assignments目录移入其中。 - 后续处理无
subModel的consultants条目时,目标路径正好是已经存在的/pages/consultants,fs-extra默认不允许将源目录移动到已存在的同路径目录下,直接抛出dest already exists错误,这也是只有assignments目录移动成功的原因。
注意:不要直接给moveSync加overwrite: true参数,这会导致第二步移动时直接覆盖已存在的/pages/consultants目录,之前移入的assignments内容会被全部删除,不符合预期。
解决方案
调整遍历优先级,先处理无subModel的顶层model目录,再处理带subModel的子目录,同时提前创建目标路径的父目录(而非目标路径本身)避免路径不存在问题,代码如下:
const fs = require('fs-extra'); const path = require('path'); const allDirs = getAllPagesDirs(appDir); // 排序:无subModel的顶层目录排在前面优先处理 allDirs.sort((prev, next) => { if (prev.subModel && !next.subModel) return 1; if (!prev.subModel && next.subModel) return -1; return 0; }); allDirs.forEach(item => { const pagesRoot = path.resolve('pages'); const targetPath = item.subModel ? path.join(pagesRoot, item.model, item.subModel) : path.join(pagesRoot, item.model); // 仅创建目标路径的上级父目录,不创建目标路径本身 fs.ensureDirSync(path.dirname(targetPath)); fs.moveSync(item.path, targetPath); });
如果要使用Node.js原生fs模块实现,逻辑完全一致,只需要自行实现递归创建父目录、递归遍历移动子文件/子目录的逻辑即可,稳定性不如直接使用fs-extra的成熟实现。
内容的提问来源于stack exchange,提问作者Dileet
相关产品推荐
相关产品推荐

