在节点中写入文件时创建目录.js

2022-08-30 00:58:11

我一直在修补Node.js发现了一个小问题。我有一个脚本,它驻留在一个名为.我希望脚本将一些数据写入子目录中子目录中的文件。但是,我收到以下错误:datadata

{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }

代码如下:

var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
}); 

任何人都可以帮助我找出如何使Node.js创建目录结构,如果它没有退出写入文件?


答案 1

节点 > 10.12.0

fs.mkdir 现在接受这样的选项:{ recursive: true }

// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

或承诺:

fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);

笔记

  1. 在许多情况下,你会使用而不是fs.mkdirSyncfs.mkdir

  2. 它是无害的/没有效果,包括尾部斜杠。

  3. mkdirSync/mkdir 没有无害的目录已经存在,没有必要检查是否存在。

节点 < = 10.11.0

你可以用一个像 mkdirpfs-extra 这样的软件包来解决这个问题。如果您不想安装软件包,请参阅下面的Tiago Peres França的答案。


答案 2

如果不想使用任何其他包,可以在创建文件之前调用以下函数:

var path = require('path'),
    fs = require('fs');

function ensureDirectoryExistence(filePath) {
  var dirname = path.dirname(filePath);
  if (fs.existsSync(dirname)) {
    return true;
  }
  ensureDirectoryExistence(dirname);
  fs.mkdirSync(dirname);
}