Make directory path: Difference between revisions
m (→{{header|REXX}}: removed parts of the comment in the header section.) |
|||
Line 105: | Line 105: | ||
The following works with any modern (Microsoft) Windows ® and/or DOS. |
The following works with any modern (Microsoft) Windows ® and/or DOS. |
||
<br>Operating system note: all versions of Microsoft ® DOS require the use of a blackslash [<big><big>'''\'''</big></big>] |
<br>Operating system note: all versions of Microsoft ® DOS require the use of a blackslash [<big><big>'''\'''</big></big>] instead of a forward slash [<big><big>'''/'''</big></big>]. |
||
<br>instead of a forward slash [<big><big>'''/'''</big></big>] as requested by the Rosetta Code task requirement. |
|||
<lang rexx>/*REXX program creates a directory and all its parent paths as necessary*/ |
<lang rexx>/*REXX program creates a directory and all its parent paths as necessary*/ |
||
trace off /*suppress possible warning msgs.*/ |
trace off /*suppress possible warning msgs.*/ |
Revision as of 23:11, 10 August 2014
You are encouraged to solve this task according to the task description, using any language you may know.
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).
It's likely that your language implements such a function as part of its standard library. If so, please also show how such a function would be implemented.
Go
The standard packages include os.MkdirAll which does exactly this (and its source is also available via that link). <lang go> os.MkdirAll("/tmp/some/path/to/dir", 0770)</lang>
Perl 6
There is a builtin function with the same name and it creates subdirectories by default.
<lang perl6>mkdir 'path/to/dir'</lang>
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>
REXX
The following works with any modern (Microsoft) Windows ® and/or DOS.
Operating system note: all versions of Microsoft ® DOS require the use of a blackslash [\] instead of a forward slash [/].
<lang rexx>/*REXX program creates a directory and all its parent paths as necessary*/
trace off /*suppress possible warning msgs.*/
dPath = 'path\to\dir'
'MKDIR' dPath "2>nul" /*alias could be used: MD Dpath */
/*stick a fork in it, we're done.*/</lang>
UNIX Shell
<lang bash>function mkdirp() { mkdir -p "$1"; }</lang>