]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/utils.cpp
Use native win32 functions for rename and unlink
[libs/core.git] / source / fs / utils.cpp
index e3c09fde6e79aa9c3d446d060a377ebeb8771ba8..9a9802524399e53c8b21e723764f939a6fd9f8c1 100644 (file)
@@ -1,4 +1,9 @@
 #include <cstdio>
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
 #include <msp/core/systemerror.h>
 #include <msp/strings/utils.h>
 #include "dir.h"
@@ -109,8 +114,7 @@ Path realpath(const Path &path)
                Path next = real/queue.front();
                queue.pop_front();
 
-               struct stat st = lstat(next);
-               if(S_ISLNK(st.st_mode))
+               if(is_link(next))
                {
                        if(++n_links>64)
                                throw runtime_error("too many symbolic links");
@@ -127,14 +131,24 @@ Path realpath(const Path &path)
 
 void rename(const Path &from, const Path &to)
 {
+#ifdef WIN32
+       if(!MoveFileEx(from.c_str(), to.c_str(), MOVEFILE_REPLACE_EXISTING))
+               throw system_error("MoveFileEx");
+#else
        if(::rename(from.str().c_str(), to.str().c_str())==-1)
                throw system_error("rename");
+#endif
 }
 
 void unlink(const Path &path)
 {
+#ifdef WIN32
+       if(!DeleteFile(path.c_str()))
+               throw system_error("DeleteFile");
+#else
        if(::unlink(path.str().c_str())==-1)
                throw system_error("unlink");
+#endif
 }
 
 Path relative(const Path &path, const Path &base)
@@ -152,6 +166,16 @@ Path relative(const Path &path, const Path &base)
        return result;
 }
 
+Path common_ancestor(const Path &path1, const Path &path2)
+{
+       Path::Iterator i = path1.begin();
+       Path::Iterator j = path2.begin();
+       Path result;
+       for(; (i!=path1.end() && j!=path2.end() && *i==*j); ++i, ++j)
+               result /= *i;
+       return result;
+}
+
 int descendant_depth(const Path &path, const Path &parent)
 {
        Path::Iterator i = path.begin();