为什么节点mkdirSync()会抛出异常?

时间:2015-10-20 18:54:13

标签: javascript node.js windows

我正在Windows 8上运行节点v4.2.0。我发现fs.mkdirSync()偶尔会无法显着推送EPERM。

我设法用这个测试代码重新创建它,我将其保存在bug.js文件中。

var fs = require("fs");
var i;
for (i = 0; i < 100000; i += 1) {
    fs.mkdirSync("xx");
    fs.rmdirSync("xx");
}

这是我偶尔获取的痕迹:

C:\WIP>node bug
C:\WIP\bug.js:0

    Error: EPERM: operation not permitted, mkdir 'C:\WIP\xx'
        at Error (native)
        at Object.fs.mkdirSync (fs.js:799:18)
        at Object.<anonymous> (C:\WIP\bug.js:4:8)
        at Module._compile (module.js:435:26)
        at Object.Module._extensions..js (module.js:442:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:311:12)
        at Function.Module.runMain (module.js:467:10)
        at startup (node.js:134:18)
        at node.js:961:3

即使使用100000循环也不会发生这种情况。事实上它是一个滑溜溜的野兽 - 如果我多次运行bug.js似乎降低了击中异常的可能性。当我尝试捕获异常时,我发现它是在循环成功迭代数千次之后发生的。

为什么会发生异常?有没有办法避免这种例外?

2 个答案:

答案 0 :(得分:0)

我认为这是Windows系统的一个缺点,你可能只是对文件夹的操作太快而且它们开始重叠并抛出这些错误。你有没有在linux系统上试过这个?

但是,如果有人要手动更改权限,则极有可能获得权限被拒绝的异常。您应该始终将这些操作放在try {} catch {}块中。

编辑:

rquist@rquist-ThinkPad-T530 ~/projects $ vim app.js # Made your code here
rquist@rquist-ThinkPad-T530 ~/projects $ node app.js 
rquist@rquist-ThinkPad-T530 ~/projects $ node app.js 
rquist@rquist-ThinkPad-T530 ~/projects $ node app.js 
rquist@rquist-ThinkPad-T530 ~/projects $ node app.js 
rquist@rquist-ThinkPad-T530 ~/projects $ node app.js 
rquist@rquist-ThinkPad-T530 ~/projects $ 

在Ubuntu 15.04上没有任何例外

答案 1 :(得分:0)

我在运行节点v4.0.0时遇到了同样的错误,如果我在Windows资源管理器中打开该文件夹,这似乎更常发生。

fs.js:747
  return binding.mkdir(pathModule._makeLong(path),
                 ^
Error: EPERM, operation not permitted 'C:\path\folder'
    at Error (native)
    at Object.fs.mkdirSync (fs.js:747:18)
    at Object.<anonymous> (C:\path\script.js:88:4)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

我降级到节点v0.12.8,同样的过程顺利进行。