fs::path make_relative(fs::path a_From, fs::path a_To) { a_From = fs::absolute(a_From); a_To = fs::absolute(a_To); fs::path ret; fs::path::const_iterator itrFrom(a_From.begin()), itrTo(a_To.begin()); // Find common base for (fs::path::const_iterator toEnd(a_To.end()), fromEnd(a_From.end()); itrFrom != fromEnd && itrTo != toEnd && *itrFrom == *itrTo; ++itrFrom, ++itrTo); // Navigate backwards in directory to reach previously found base for (fs::path::const_iterator fromEnd(a_From.end()); itrFrom != fromEnd; ++itrFrom) { if( (*itrFrom) != "." ) ret /= ".."; } // Now navigate down the directory branch ret.append( itrTo, a_To.end() ); return ret; }
// Return path when appended to from will resolve to same as to boost::filesystem::path makeRelativePath(boost::filesystem::path from, boost::filesystem::path to) { boost::filesystem::path ret; boost::filesystem::path::const_iterator itrFrom(from.begin()), itrTo(to.begin()); from = boost::filesystem::absolute(from); to = boost::filesystem::absolute(to); // Find common base for (boost::filesystem::path::const_iterator toEnd(to.end()), fromEnd(from.end()); itrFrom != fromEnd && itrTo != toEnd && *itrFrom == *itrTo; ++itrFrom, ++itrTo) ; // Navigate backwards in directory to reach previously found base for (boost::filesystem::path::const_iterator fromEnd(from.end()); itrFrom != fromEnd; ++itrFrom) { if ((*itrFrom) != ".") ret /= ".."; } // Now navigate down the directory branch ret.append(itrTo, to.end()); return ret; }