我正在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似乎降低了击中异常的可能性。当我尝试捕获异常时,我发现它是在循环成功迭代数千次之后发生的。
为什么会发生异常?有没有办法避免这种例外?
答案 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
,同样的过程顺利进行。