aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-07-10 15:33:45 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-07-10 15:33:45 +0200
commit80b4ee65c55c896f12109c338ba9aa386b5719c6 (patch)
treed374717f6603429d5f870c3d002ab0998626cf88
parent49cd0e47d3783bcc31521a2425061ca7fae07363 (diff)
Implement try_mkdir_p()
-rw-r--r--butl/filesystem6
-rw-r--r--butl/filesystem.cxx14
2 files changed, 20 insertions, 0 deletions
diff --git a/butl/filesystem b/butl/filesystem
index 4d0b7ef..63b19ff 100644
--- a/butl/filesystem
+++ b/butl/filesystem
@@ -56,6 +56,12 @@ namespace butl
mkdir_status
try_mkdir (const path&, mode_t = 0777);
+ // The '-p' version of the above (i.e., it creates the parent
+ // directories if necessary).
+ //
+ mkdir_status
+ try_mkdir_p (const path&, mode_t = 0777);
+
// Try to remove the directory returning not_exist if it does not
// exist and not_empty if it is not empty. All other errors are
// reported by throwing std::system_error.
diff --git a/butl/filesystem.cxx b/butl/filesystem.cxx
index 4cf60b2..c65d591 100644
--- a/butl/filesystem.cxx
+++ b/butl/filesystem.cxx
@@ -108,6 +108,20 @@ namespace butl
return r;
}
+ mkdir_status
+ try_mkdir_p (const path& p, mode_t m)
+ {
+ if (!p.root ())
+ {
+ path d (p.directory ());
+
+ if (!dir_exists (d))
+ try_mkdir_p (d, m);
+ }
+
+ return try_mkdir (p, m);
+ }
+
rmdir_status
try_rmdir (const path& p)
{