X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fdir.cpp;h=f7f34f668492383087c78ddb4f2627a4e551e38e;hp=c53c156fec68b6e2df51c2afdb09396281ae92bd;hb=c8af8a2167685dc52c6e77951f3fa6ee53d67654;hpb=19edaf3b45bc4c23459fc8ddd552dcfa33eecc71 diff --git a/source/fs/dir.cpp b/source/fs/dir.cpp index c53c156..f7f34f6 100644 --- a/source/fs/dir.cpp +++ b/source/fs/dir.cpp @@ -1,9 +1,11 @@ #include #include #include -#include #ifdef WIN32 #include +#else +#include +#include #endif #include #include @@ -62,17 +64,14 @@ not_a_directory::not_a_directory(const Path &p): void mkdir(const Path &path, int mode) { - int err; #ifdef WIN32 - // The win32 version of this function doesn't take the mode argument. Go figure. (void)mode; - err = ::mkdir(path.str().c_str()); + if(!CreateDirectory(path.str().c_str(), NULL)) + throw system_error("CreateDirectory"); #else - err = ::mkdir(path.str().c_str(), mode); -#endif - - if(err==-1) + if(::mkdir(path.str().c_str(), mode)==-1) throw system_error("mkdir"); +#endif } void mkpath(const Path &path, int mode) @@ -85,16 +84,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(FS::Stat st = stat(p)) { - if(!S_ISDIR(st.st_mode)) + if(!st.is_directory()) throw not_a_directory(p); continue; } - else if(errno!=ENOENT) - throw system_error("mkpath:stat"); else mkdir(p, mode); } @@ -102,19 +97,23 @@ void mkpath(const Path &path, int mode) void rmdir(const Path &path) { +#ifdef WIN32 + if(!RemoveDirectory(path.str().c_str())) + throw system_error("RemoveDirectory"); +#else if(::rmdir(path.str().c_str())==-1) throw system_error("rmdir"); +#endif } -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); }