【问题标题】:EPERM while renaming directory in node js randomly随机重命名节点js中的目录时的EPERM
【发布时间】:2015-12-04 02:42:39
【问题描述】:

我有一个要求,我需要从中删除备份文件夹,我需要将处理器重命名为备份,我需要再次创建处理器文件夹并需要向用户发送响应。为此,我使用以下代码。

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"}

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

感谢您阅读本文。

【问题讨论】:

    标签: javascript node.js express fs


    【解决方案1】:

    你并不孤单,我在 jasmine 中测试我的代码时也发现了这个问题,但我无法以更简洁的方式重现它。我会说它以 1% 的概率发生,隔离它需要很长时间:-)

    在我的情况下,它与窗口资源管理器无关。出错后立即重试!这是我解决此问题的应用程序代码:

    try {
      fs.renameSync(oldDir, newDir);
    }
    catch (e) {
      fs.renameSync(oldDir, newDir);
    }
    

    就这么简单,这种简单让我觉得这是节点中的一个错误。

    rmdirSync 发出错误错误可能也有同样的问题,但由于它发生在相互依赖的异步回调之间,与 renameSync 问题相反,我不会那么肯定。

    我正在使用节点 v5.3.0

    【讨论】:

      【解决方案2】:

      我发现 Windows 上的同步命令存在同样的问题 fs.removeSync('文件夹'); fs.mkdirsSync('文件夹'); 当打开 Windows 资源管理器的实例并且“文件夹”显示在资源管理器中的任何位置时,似乎会引发 EPERM 错误。到目前为止,除了关闭资源管理器(并等待几秒钟)之外,我没有找到任何解决方案,这非常烦人......

      【讨论】:

        【解决方案3】:

        我已阅读相关问题的答案in this very nice post。简而言之,当 Node 文档说某些文件系统的事情已同步或异步完成时,它只会为您提供一个接近的近似值(即它说谎;-))。根据您使用的 API,您必须稍等片刻才能有效完成。

        那里公开的信息很好地解释了我的代码中的“随机错误”,包括像您描述的 EPERM 问题,以及为什么“立即”重试刚刚失败的操作(至少大部分时间:-))

        【讨论】:

          【解决方案4】:

          有时某些进程(如 AV 软件)会锁定目标文件夹。在 Windows 上防止此类错误的唯一方法是重复重命名。

          您可以使用graceful-fs 包或自己实现类似的逻辑。检查它是如何solved in graceful-fs

          【讨论】:

            猜你喜欢
            • 2019-10-22
            • 2015-03-13
            • 2018-07-20
            • 2020-09-25
            • 1970-01-01
            • 2015-10-08
            • 1970-01-01
            • 2019-08-04
            • 1970-01-01
            相关资源
            最近更新 更多