Boost v1.48 и выше
Вы можете использовать boost::filesystem::canonical
:
path canonical(const path& p, const path& base = current_path());
path canonical(const path& p, system::error_code& ec);
path canonical(const path& p, const path& base, system::error_code& ec);
http://www.boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/reference.html#canonical
v1.48 и выше также предоставить boost::filesystem::read_symlink
функция для разрешения символических ссылок.
Повышение версий до v1.48
Как упоминалось в других ответах, вы не можете нормализоваться, потому что boost :: filesystem не может следовать по символическим ссылкам.Тем не менее, вы можете написать функцию, которая нормализует «как можно больше» (при условии, что «.» И «..» обрабатываются нормально), так как boost предлагает возможность определить, является ли файл символической ссылкой.
То есть, если родительский элемент ".." является символической ссылкой, то вы должны сохранить ее, в противном случае ее, вероятно, можно удалить, и, вероятно, всегда безопасно удалить ".".
Это похоже на манипулирование реальной строкой, но немного более элегантно.
boost::filesystem::path resolve(
const boost::filesystem::path& p,
const boost::filesystem::path& base = boost::filesystem::current_path())
{
boost::filesystem::path abs_p = boost::filesystem::absolute(p,base);
boost::filesystem::path result;
for(boost::filesystem::path::iterator it=abs_p.begin();
it!=abs_p.end();
++it)
{
if(*it == "..")
{
// /a/b/.. is not necessarily /a if b is a symbolic link
if(boost::filesystem::is_symlink(result) )
result /= *it;
// /a/b/../.. is not /a/b/.. under most circumstances
// We can end up with ..s in our result because of symbolic links
else if(result.filename() == "..")
result /= *it;
// Otherwise it should be safe to resolve the parent
else
result = result.parent_path();
}
else if(*it == ".")
{
// Ignore
}
else
{
// Just cat other path entries
result /= *it;
}
}
return result;
}