如果父文件夹不存在,如何写文件?
我需要写文件到以下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.Stats
types的对象,你可以检查stats.isDirectory()
。 根据err
和stats
的检查,你可以做一些事情, 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.sep
和path.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);