node.jsrecursion写入文件目录

如果文件位于可能存在或不存在的目录中,如何使用nodejs写入文件?

这有点类似于这个问题:

node.js写文件的目录?

只有我需要一个创build文件的解决scheme,而node-fs只能创build目录。

从FileUtils :

修改function以满足您的需求! 但严重的是,使用一个模块,而不是写自己的!

createDirectory() :创build一个目录。 如果任何形成path的以前的目录不存在,则会创build它们。 默认权限:0777。

File.prototype.createDirectory = function (cb){ if (cb) cb = cb.bind (this); if (!this._path){ if (cb) cb (NULL_PATH_ERROR, false); return; } if (!canWriteSM (this._usablePath)){ if (cb) cb (SECURITY_WRITE_ERROR, false); return; } var mkdirDeep = function (path, cb){ path.exists (function (exists){ if (exists) return cb (null, false); FS.mkdir (path.getPath (), function (error){ if (!error) return cb (null, true); var parent = path.getParentFile (); if (parent === null) return cb (null, false); mkdirDeep (parent, function (error, created){ if (created){ FS.mkdir (path.getPath (), function (error){ cb (error, !error); }); }else{ parent.exists (function (exists){ if (!exists) return cb (null, false); FS.mkdir (path.getPath (), function (error){ cb (error, !error); }); }); } }); }); }); }; mkdirDeep (this.getAbsoluteFile (), function (error, created){ if (cb) cb (error, created); }); }; 

createNewFile() :创build一个新文件。 默认权限:0666。

 File.prototype.createNewFile = function (cb){ if (cb) cb = cb.bind (this); if (!this._path){ if (cb) cb (NULL_PATH_ERROR, false); return; } if (!canWriteSM (this._usablePath)){ if (cb) cb (SECURITY_WRITE_ERROR, false); return; } var path = this._usablePath; PATH.exists (path, function (exists){ if (exists){ if (cb) cb (null, false); }else{ var s = FS.createWriteStream (path); s.on ("error", function (error){ if (cb) cb (error, false); }); s.on ("close", function (){ if (cb) cb (null, true); }); s.end (); } }); }; 

我只是写了这个答案如何写文件,如果父文件夹不存在? 。 可能会有人在Google中遇到这样的问题:

首先将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) }) } 

你可以使用像createWriteStream这样的createWriteStream

如果文件不存在,它会创build文件。

由于fs.exists()已被弃用 ,这里是另一个使用fs.access()asynchronous版本,并且没有外部npm模块:

 "use strict"; var fs = require('fs'); var path = require('path'); var fileName = '\\tmp\\a\\b\\c\\d.txt'; // eg using Windows path separator var contents = 'any content'; createDirectoryAndFile(fileName, contents); function createDirectoryAndFile(fileName, contents) { var dirName = path.dirname(fileName); var pathAsArray = dirName.split(path.sep); _createDirectoryAndFile(pathAsArray, '', function() { fs.open(fileName, 'w+', function(error, data) { fs.writeFile(fileName, contents, function(error) {}); }); }); } function _createDirectoryAndFile(pathAsArray, pathSoFar, createFile) { if (!pathAsArray || pathAsArray.length === 0) { createFile(); return; } var dir = pathAsArray.shift(); pathSoFar = pathSoFar + dir + path.sep; fs.access(pathSoFar, function(error) { if (error) { // directory does not exist fs.mkdir(pathSoFar, function(error) { if (!error) { _createDirectoryAndFile(pathAsArray, pathSoFar, createFile); } }); } else { _createDirectoryAndFile(pathAsArray, pathSoFar, createFile); } }); } 

这当然需要通过添加error handling和支持权限来改进。

对于TypeScript用户,这里是我刚才写的基于mkdirP的一个 :

 const _0777 = parseInt('0777', 8); export function mkdirP(dir: string, opts: { fs?: { mkdir: (path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void) => void, stat: (path: string | Buffer, callback?: (err: NodeJS.ErrnoException, stats: fs.Stats) => any) => void }, mode?: number}, f: Function, made?) { dir = resolve(dir); if (typeof opts === 'function') { f = <Function>opts; opts = {}; } else if (!opts || typeof opts !== 'object') opts = {mode: <number>opts}; opts.mode = opts.mode || (_0777 & (~process.umask())); opts.fs = opts.fs || fs; if (!made) made = null; const cb = f || (() => undefined); opts.fs.mkdir(dir, opts.mode, function (error) { if (!error) { made = made || dir; return cb(null, made); } switch (error.code) { case 'ENOENT': mkdirP(dirname(dir), opts, function (err, made) { if (err) cb(err, made); else mkdirP(dir, opts, cb, made); }); break; default: opts.fs.stat(dir, function (e, stat) { if (e || !stat.isDirectory()) cb(error || e, made); else cb(null, made); }); } }); } 

JavaScript版本只是从签名中删除types注释,即:将前几行改为: (dir, opts, mode, f, made) {

 // Create parentDir recursively if it doesn't exist! const parentDir = 'path/to/parent'; parentDir.split('/').forEach((dir, index, splits) => { const curParent = splits.slice(0, index).join('/'); const dirPath = path.resolve(curParent, dir); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); } }); // Create file.js inside the parentDir fs.writeFileSync(`${parentDir}/file.js`, 'file Content', 'utf8'); 

你可以使用https://github.com/douzi8/file-system

 var file = require('file-system'); file.mkdir('1/2/3/4/5', [mode], function(err) {});