#c #boost #symlink #boost-filesystem
#c #boost #символическая ссылка #boost-файловая система
Вопрос:
Моя программа рекурсивно обходит каталог проекта, где могут возникать циклические символические ссылки, которые вызывают исключение (слишком много уровней символических ссылок) на другом шаге алгоритма. Я хотел бы найти циклические символические ссылки, чтобы избежать таких исключений. (Исправление проекта путем удаления циклических символических ссылок, к сожалению, не вариант.)
Есть ли способ обнаружить циклические символические ссылки с помощью boost::filesystem
? Я уже думал о разрешении символических ссылок с read_symlink()
помощью и продолжаю его рекурсивным способом, если символическая ссылка преобразуется в другую символическую ссылку, но это не совсем оптимальное решение.
Ответ №1:
Вы должны иметь возможность использовать boost::filesystem::canonical
или weakly_canonical
(в случае, если файл не обязательно должен существовать).
Обратите внимание, что при большом количестве символических ссылок со многими элементами пути могут возникнуть накладные расходы на производительность, поскольку элементы пути редактируются stat
, создавая новый экземпляр пути.
#include <boost/filesystem.hpp>
#include <iostream>
int main(int argc, char** argv) {
using namespace boost::filesystem;
for (path link : std::vector(argv 1, argv argc)) {
boost::system::error_code ec;
auto target = canonical(link, ec);
if (ec) {
std::cerr << link << " -> " << ec.message() << "n";
} else {
std::cout << link << " -> " << target << "n";
}
if (ec) {
target = weakly_canonical(link, ec);
if (!ec) {
std::cerr << " -- weakly: -> " << target << "n";
}
}
}
}
При создании нескольких символических ссылок различного качества:
ln -sf main.cpp a
ln -sf b b
ln -sf d c
Запуск его с помощью a b c d
:
"a" -> "/tmp/1613746951-1110913523/main.cpp"
"b" -> Too many levels of symbolic links
"c" -> No such file or directory
-- weakly: -> "c"
"d" -> No such file or directory
-- weakly: -> "d"
Комментарии:
1. Добавлена демонстрация в прямом эфире на Coliru