एक कड़ी से लिया टिकट निकोल से जुड़ा हुआ अनुसरण करके प्राप्त:
template < >
path& path::append< typename path::iterator >(typename path::iterator begin, typename path::iterator end, const codecvt_type& cvt)
{
for(; begin != end ; ++begin)
*this /= *begin;
return *this;
}
// Return path when appended to a_From will resolve to same as a_To
boost::filesystem::path make_relative(boost::filesystem::path a_From, boost::filesystem::path a_To)
{
a_From = boost::filesystem::absolute(a_From); a_To = boost::filesystem::absolute(a_To);
boost::filesystem::path ret;
boost::filesystem::path::const_iterator itrFrom(a_From.begin()), itrTo(a_To.begin());
// Find common base
for(boost::filesystem::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(boost::filesystem::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;
}
छड़ी है कि एक हेडर फाइल में है और इसे आप क्या चाहते हैं क्या करना चाहिए।
नमूना कॉल:
boost::filesystem::path a("foo/bar"), b("foo/test/korv.txt");
std::cout << make_relative(a, b).string() << std::endl;
स्रोत
2012-04-16 00:55:04
सब और विफल रहता है, निरपेक्ष तार करने के लिए दोनों को बदलने और दूसरे से सबस्ट्रिंग। –
बूस्ट के नए संस्करणों में ** बहुत सरल ** इसका उत्तर दिया गया है, [नीचे दिया गया] [https://stackoverflow.com/a/37715252/16287) –