Node.js在Windows文件系统路径错误4058 ENOENT

5

我正在windows系统中使用Node.js的文件系统来写入进程日志,以下是我的代码:

var fs = require('fs');
var config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
var statusLogStream = fs.createWriteStream("../logs/load stat"+(new Date())+".log");

出现错误了。
    { [Error: ENOENT: no such file or directory, open 'C:\proc\logs\load stat Mon Apr 18 2016 19:09:32 GMT+0530 (India Standard Time).log']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\proc\\logs\\load stat Mon Apr 18 2016 19:09:32 GMT+0530 (India Standard Time).log' }
events.js:141
      throw er; // Unhandled 'error' event
  ^

我试着手动打开文件夹C:\\proc\\logs,但它无法打开,当我将双反斜杠替换为正斜杠时,C:/proc/logs可以手动从资源管理器中打开文件夹。

如何让它工作?

为什么它会采用双反斜杠而不是正斜杠

重要提示:上述代码在Linux Ubuntu服务器上完美运行,但在Windows上不行。


@Tresdin:坦白说,我也知道这一点。但是,我需要对上面的代码进行哪些代码更改才能使其正常工作? - veer7
2个回答

6
问题不在斜杠上,而在于日期如何转换为字符串。我敢打赌这会起作用:
var statusLogStream = fs.createWriteStream("../logs/load stat.log");

更新 Windows在日期的字符串表示中(Mon Apr 18 2016 19**:**09**:**32 GMT+0530 (India Standard Time))抱怨两个冒号。

这可能是一个不错的替代方案:

var myDate = new Date().toJSON().replace(new RegExp(':', 'g'),'.');
// myDate is now "2016-04-18T15.19.21.174Z"
var statusLogStream = fs.createWriteStream("../logs/load stat"+(myDate)+".log");

你是怎么想出来的呢?我一点头绪都没有。 - veer7
我首先尝试了一个简单的测试 ./loadstat.log 来检查斜杠问题。然后我逐步添加代码,直到出现错误。特别是Windows系统抱怨文件名中存在两个冒号。仍在调查原因... - Francesco
1
在Windows平台上使用节点时,我发现文件夹名称中带有特殊字符(如“*”)以及以“.”结尾的名称会导致问题...因此,在进行IO操作之前,我们总是对文件名和文件夹名称进行“规范化”处理... - A. Masson

0

我也遇到了同样的问题。

在我的项目中,当我运行一个express应用程序时,我注意到当前工作目录是项目的根目录(而我正在尝试读取位于脚本目录中的文件)。 由于process.cwd() !== __dirname,它无法运行该文件。

您可以检查并在尝试读取json文件的脚本中控制台记录process.cwd()

我只是将路径更改为:

const fs = require('fs');
fs.readFileSync(`${__dirname}\\FILENAME`);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接