Make directory path: Difference between revisions
No edit summary |
|||
Line 60: | Line 60: | ||
{{works with|Node.js}} |
{{works with|Node.js}} |
||
Simplified version of the popular [https://www.npmjs.org/package/mkdirp mkdirp library]: |
|||
<lang Javascript>var path = require('path'); |
<lang Javascript>var path = require('path'); |
||
var fs = require('fs'); |
var fs = require('fs'); |
||
function mkdirp (p, |
function mkdirp (p, cb) { |
||
cb = cb || function () {}; |
|||
var cb = f || function () {}; |
|||
p = path.resolve(p); |
p = path.resolve(p); |
||
fs.mkdir(p, function (er) { |
fs.mkdir(p, function (er) { |
||
if (!er) { |
if (!er) { |
||
return cb(null); |
|||
return cb(null, made); |
|||
} |
} |
||
switch (er.code) { |
switch (er.code) { |
||
case 'ENOENT': |
case 'ENOENT': |
||
// The directory doesn't exist. Make its parent and try again. |
|||
mkdirp(path.dirname(p), function (er) { |
|||
if (er) cb(er); |
|||
⚫ | |||
}); |
}); |
||
break; |
break; |
||
// In the case of any other error, |
// In the case of any other error, something is borked. |
||
// there already. If so, then hooray! If not, then something |
|||
// is borked. |
|||
default: |
default: |
||
cb(er); |
|||
// if the stat fails, then that's super weird. |
|||
// let the original error be the failure reason. |
|||
if (er2 || !stat.isDirectory()) cb(er, made) |
|||
⚫ | |||
}); |
|||
break; |
break; |
||
} |
} |
||
}); |
}); |
||
⚫ | |||
} |
|||
⚫ | |||
=={{header|UNIX Shell}}== |
=={{header|UNIX Shell}}== |
Revision as of 05:18, 9 August 2014
Create a directory and any missing parents.
This task is named after the posix mkdir -p
command, and several libraries which implement the same behavior.
Please implement a function of a single path string (for example ./path/to/dir
) which has the above side-effect.
If the directory already exists, return successfully.
Ideally implementations will work equally well cross-platform (on windows, linux, and OS X).
Python
<lang Python> from errno import EEXIST from os import mkdir, curdir from os.path import split, exists
def mkdirp(path, mode=0777):
head, tail = split(path) if not tail: head, tail = split(head) if head and tail and not exists(head): try: mkdirp(head, mode) except OSError as e: # be happy if someone already created the path if e.errno != EEXIST: raise if tail == curdir: # xxx/newdir/. exists if xxx/newdir exists return try: mkdir(path, mode) except OSError as e: # be happy if someone already created the path if e.errno != EEXIST: raise
</lang>
Above is a modified version of the standard library's os.makedirs
, for pedagogical purposes. In practice, you would be more likely to use the standard library call:
<lang Python> def mkdirp(path):
try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise
</lang>
In Python3 this becomes even simpler:
<lang Python> def mkdirp(path):
os.makedirs(path, exist_ok=True)
</lang>
JavaScript
Simplified version of the popular mkdirp library:
<lang Javascript>var path = require('path'); var fs = require('fs');
function mkdirp (p, cb) {
cb = cb || function () {}; p = path.resolve(p);
fs.mkdir(p, function (er) { if (!er) { return cb(null); } switch (er.code) { case 'ENOENT': // The directory doesn't exist. Make its parent and try again. mkdirp(path.dirname(p), function (er) { if (er) cb(er); else mkdirp(p, cb); }); break;
// In the case of any other error, something is borked. default: cb(er); break; } });
}</lang>
UNIX Shell
<lang bash>function mkdirp() { mkdir -p $1; }</lang>