#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"
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");
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)
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();