如果父文件夹不存在,如何写文件?

我需要写文件到以下path:

fs.writeFile('/folder1/folder2/file.txt', 'content', function () { }); 

但是'/folder1/folder2'path可能不存在。 所以我得到以下错误:

  message=ENOENT, open /folder1/folder2/file.txt 

我怎样才能将内容写入该path?

首先将mkdirp与path.dirname结合使用。

 var mkdirp = require('mkdirp'); var fs = require('fs'); var getDirName = require('path').dirname; function writeFile(path, contents, cb) { mkdirp(getDirName(path), function (err) { if (err) return cb(err); fs.writeFile(path, contents, cb); }); } 

如果整个path已经存在, mkdirp是一个noop。 否则,它会为您创build所有丢失的目录。

这个模块做你想要的: https : //npmjs.org/package/writefile 。 当谷歌search“writefile mkdirp”时得到它。 这个模块返回一个promise,而不是callback,所以一定要先阅读promise的一些介绍。 这可能会让事情变复杂。

无论如何,我所做的function都是有效的。

也许最简单的,你可以使用fs-path npm模块。

您的代码将如下所示:

 var fsPath = require('fs-path'); fsPath.writeFile('/folder1/folder2/file.txt', 'content', function(err){ if(err) { throw err; } else { console.log('wrote a file like DaVinci drew machines'); } }); 

我发现最简单的方法是使用fs-extra模块的outputFile ()方法。

几乎与writeFile(即覆盖)相同,除了如果父目录不存在,它是创build。 选项是你要传给fs.writeFile()的东西。

例:

 var fs = require('fs-extra'); var file = '/tmp/this/path/does/not/exist/file.txt' fs.outputFile(file, 'hello!', function (err) { console.log(err); // => null fs.readFile(file, 'utf8', function (err, data) { console.log(data); // => hello! }); }); 

它也有承诺支持开箱即日!

您可以使用

 fs.stat('/folder1/folder2', function(err, stats){ ... }); 

stats是一个fs.Statstypes的对象,你可以检查stats.isDirectory() 。 根据errstats的检查,你可以做一些事情, fs.mkdir( ... )或抛出一个错误。

参考

更新:修复代码中的逗号。

如果它们不存在,recursion地创build目录! ( 零依赖

 const fs = require('fs'); const path = require('path'); const targetDir = '/folder1/folder2'; const sep = path.sep; const initDir = path.isAbsolute(targetDir) ? sep : ''; targetDir.split(sep).reduce((parentDir, childDir) => { const curDir = path.resolve(parentDir, childDir); if (!fs.existsSync(curDir)) { fs.mkdirSync(curDir); } return curDir; }, initDir); // Then create your file fs.writeFile(path.resolve(targetDir, 'file.txt'), 'content', () => {}); 

尝试一下!

  • 该解决scheme处理相对path和绝对path
  • 在相对path的情况下,将在当前工作目录中创build(parsing)目标目录。 要将它们parsing为当前的脚本目录,请使用__dirname ,如下所示: path.resolve(__dirname, parentDir, childDir);
  • 使用path.seppath.resolve() ,而不仅仅是/ concatenation,以避免跨平台的问题。

这是Myrne Stol的答案,作为一个单独的答案分解出来的一部分:

这个模块做你想要的: https : //npmjs.org/package/writefile 。 当谷歌search“writefile mkdirp”时得到它。 这个模块返回一个promise,而不是callback,所以一定要先阅读promise的一些介绍。 这可能会让事情变复杂。

这是我的自定义函数recursion创build目录(没有外部依赖):

 var fs = require('fs'); var path = require('path'); var myMkdirSync = function(dir){ if (fs.existsSync(dir)){ return } try{ fs.mkdirSync(dir) }catch(err){ if(err.code == 'ENOENT'){ myMkdirSync(path.dirname(dir)) //create parent dir myMkdirSync(dir) //create dir } } } myMkdirSync(path.dirname(filePath)); var file = fs.createWriteStream(filePath);