17

Is it possible to use the fs API to create a directory and all necessary subdirectories like the -p parameter does when using the mkdir command?

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Pablo
  • 456
  • 2
  • 7
  • 18
  • This is an answer which I wrote to another similar question https://stackoverflow.com/a/44410793/2834139 – Arvin Jun 07 '17 at 11:20
  • Possible duplicate of [How to create full path with node's fs.mkdirSync?](https://stackoverflow.com/questions/31645738/how-to-create-full-path-with-nodes-fs-mkdirsync) – acdcjunior Jun 24 '19 at 03:46

3 Answers3

51

Use fs.mkdirSync with the recursive: true option:

fs.mkdirSync('/tmp/a/apple', { recursive: true });
Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Dániel Mari
  • 519
  • 4
  • 2
  • 2
    Note that this API is available since v10.12.0. This answer is cleaner than the accepted answer because it does not require installing dependencies. – cadesalaberry Feb 21 '21 at 18:19
  • Beware, I just wasted hours with weird issues where the node process froze so badly I could not kill it nor restart WSL, and had to reboot. This is NOT safe! – Killroy Oct 06 '22 at 08:59
  • @Killroy Sounds like you have a really weird setup, because it's been part of Node for years now. Maybe file a bug with the Node folks instead? But it's almost certainly something else interfering. – Mike 'Pomax' Kamermans Feb 21 '23 at 18:06
2

You can either write your own version or use a module like mkdirp

simon-p-r
  • 3,623
  • 2
  • 20
  • 35
1

You can also use a NPM package called fs-extra that conveniently allows you to do this:

const fs = require("fs-extra");

async function createFolder(folder) {
  try {
    await fs.ensureDirSync(folder); // guarantees the directory is created, or error.
  } catch (err) {
    throw new Error('You do not have the right permissions to make this folder.');
  }
}
Bilawal Hameed
  • 258
  • 4
  • 11
  • 1
    There is no reason to import fs-extra if you just need mkdirp. Node's own `mkdir` has had this functionality built in for years (and definitely at the time of this answer) in the form of the `recursive` option. – Mike 'Pomax' Kamermans Feb 21 '23 at 18:05