Node.js recursive file directory for writing

How to use nodejs to write a file if the file is in a directory that may or may not exist?

This is similar to this question:

node.js Writing a directory file

Only I need a solution that creates the file, and node -fs only creates directories.

+4
source share
7 answers

From FileUtils :

Change the features that suit your needs! But seriously, use a module instead of writing your own!

createDirectory () : creates a directory. If any of the previous directories that form the path does not exist, they are created. The default permissions are 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 () : Creates a new file. The default permissions are 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 (); } }); }; 
+5
source

I just wrote this as an answer. How to write a file if the parent folder does not exist? . It may be useful if someone stumbles upon this on Google:

Use mkdirp in combination with path.dirname first.

 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) }) } 
+3
source

You can just use something like createWriteStream .

It will simply create the file if it does not exist.

0
source

Since fs.exists() deprecated , here is another version of async using fs.access() and without npm external modules:

 "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); } }); } 

This, of course, needs to be improved by adding error handling and supportive permissions.

0
source

For TypeScript users, I just wrote here, based on 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); }); } }); } 

The JavaScript version simply removes type annotations from the signature, i.e. turns these first few lines to: (dir, opts, mode, f, made) { .

0
source
 // 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'); 
0
source

you can use https://github.com/douzi8/file-system

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

Source: https://habr.com/ru/post/1414075/


All Articles