EPERM随机重命名节点js中的目录

时间:2015-09-08 12:03:40

标签: javascript node.js express fs

我需要删除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"}

我不知道我错过了什么,它随机发生。

感谢您阅读本文。

4 个答案:

答案 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