X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fdir.cpp;h=2575beb76580de0578c51f9da5aa38041e77aabd;hp=08328548440ae6a18fdf8668d7db2aaeda182c87;hb=5dc87e4456db444a48081bbcfab9294bf35a3f55;hpb=d16185720fa344263367dbd50c61bfc8183d99a4 diff --git a/source/fs/dir.cpp b/source/fs/dir.cpp index 0832854..2575beb 100644 --- a/source/fs/dir.cpp +++ b/source/fs/dir.cpp @@ -4,8 +4,10 @@ #include #ifdef WIN32 #include +#else +#include #endif -#include +#include #include #include #include "dir.h" @@ -54,6 +56,12 @@ const Path &get_bin_dir(const string &argv0) } + +not_a_directory::not_a_directory(const Path &p): + runtime_error(p.str()) +{ } + + void mkdir(const Path &path, int mode) { int err; @@ -66,7 +74,7 @@ void mkdir(const Path &path, int mode) #endif if(err==-1) - throw SystemError("mkdir failed", errno); + throw system_error("mkdir"); } void mkpath(const Path &path, int mode) @@ -79,16 +87,12 @@ void mkpath(const Path &path, int mode) if(p.size()==1 && p.is_absolute()) continue; #endif - struct stat st; - int err = stat(p, st); - if(err==0) + if(exists(p)) { - if(!S_ISDIR(st.st_mode)) - throw Exception("A component exists and is not a directory"); + if(!is_dir(p)) + throw not_a_directory(p); continue; } - else if(errno!=ENOENT) - throw SystemError("stat failed", errno); else mkdir(p, mode); } @@ -97,18 +101,17 @@ void mkpath(const Path &path, int mode) void rmdir(const Path &path) { if(::rmdir(path.str().c_str())==-1) - throw SystemError("rmdir failed", errno); + throw system_error("rmdir"); } -void rmdirs(const Path &path) +void rmpath(const Path &path) { list files = list_files(path); for(list::iterator i=files.begin(); i!=files.end(); ++i) { Path p = path / *i; - struct stat st = stat(p.str().c_str()); - if(S_ISDIR(st.st_mode)) - rmdirs(p); + if(is_dir(p)) + rmpath(p); else unlink(p); } @@ -213,7 +216,7 @@ Path get_sys_lib_dir(const string &argv0, const string &appname) void chdir(const Path &path) { if(::chdir(path.str().c_str())==-1) - throw SystemError("chdir failed", errno); + throw system_error("chdir"); } } // namespace FS