我需要删除Backup文件夹,我需要将处理器重命名为Backup,我需要再次创建Processor文件夹,并需要向用户发送响应。为此,我使用下面的代码。
fsExtra.remove('app/Backup', function(err, result) {
if(err){
console.log("Err in removing Backup folder "+JSON.stringify(err));
}else{
fs.rename('app/Processor','app/Backup', function(err, result) {
if(err){
console.log("Err in renaming folder "+JSON.stringify(err));
}else{
fs.mkdir('app/Processor', function(err, result) {
if(err){
console.log("Err in mk Backup folder "+JSON.stringify(err));
}else{
res.send("success");
}
});
}
});
}
});
很多时候它按预期工作,但有一次它给出了以下错误
Err in renaming folder {"errno":50,"code":"EPERM","path":"C:\\Work Bench\\WorkSpace\\Sprint22\\project_name\\app\\Backup"}
我不知道我错过了什么,它随机发生。
感谢您阅读本文。
答案 0 :(得分:0)
我在Windows上观察到同步命令的相同问题 fs.removeSync( '文件夹'); fs.mkdirsSync( '文件夹'); 打开Windows资源管理器的实例并在资源管理器中的任何位置显示“文件夹”时,似乎会抛出EPERM错误。到目前为止,除了关闭探险器(并等待几秒钟)之外,我找不到任何解决方案,这非常烦人......
答案 1 :(得分:0)
你并不孤单,当我在茉莉花中测试我的代码时,我也发现了这个问题,而且我无法以更简洁的方式重现它。我会说它以1%的概率发生,需要很长时间来隔离它: - )
在我的情况下,它与窗口浏览器无关。错误后立即重试!这是解决问题的应用程序代码:
try {
fs.renameSync(oldDir, newDir);
}
catch (e) {
fs.renameSync(oldDir, newDir);
}
就这么简单,这种简单性让我觉得它是节点中的一个错误。
我可能也有同样的问题,rmdirSync也发出了错误的错误,但由于它发生在相互依赖的异步回调之间,而不是renameSync问题,我不会那么肯定。
我使用的是节点v5.3.0
答案 2 :(得分:0)
我已阅读相关问题的答案in this very nice post。简而言之,Node文档只是在给出一些文件系统事件(同步或异步)时,只给出了一个近似的近似值(即它位于;-))。根据您使用的API,您必须等待一段时间才能有效地完成。
那里暴露的信息很好地解释了我的代码中的“随机错误”,包括你描述的EPERM问题,以及为什么“立即”重试“失败”的操作(大部分时间至少:-))< / p>
答案 3 :(得分:0)
有时诸如AV软件之类的某些进程可以锁定目标文件夹。 Windows上防止此类错误的唯一方法是重复重命名。
您可以使用graceful-fs包或自己实现类似的逻辑。检查它的solved in graceful-fs