Boost::filesystem::is_symlink() не работает

Когда я запускаю этот фрагмент кода, он говорит, что каждый файл является обычным, даже символические ссылки:

cout<<boost::filesystem::is_symlink(boost::filesystem::status("link-name"))<<endl;

Кто-нибудь знает, почему? (во время компиляции нет ни предупреждений, ни ошибок) Ссылка создана командой:

ln -s file-name link-name

и команда ls говорит, что это ссылка:

ls -l link-name
lrwxrwxrwx 1 myname mygroup 8 juil. 23 14:12 link-name -> file-name

Спасибо !

РЕДАКТИРОВАТЬ: с другой стороны, функция boost::filesystem::is_regular_file всегда возвращает true.


person StormRider    schedule 23.07.2014    source источник


Ответы (2)


Вы должны использовать symlink_status(const path& p), как в справочной документации по повышению эффективности< /а>.

file_status symlink_status(const path& p);

Возвращает: То же, что и status(), за исключением того, что если атрибуты указывают на символическую ссылку, как если бы это было в ISO/IEC 9945 S_ISLNK(), возвращается file_status(symlink_file).

person Alper    schedule 23.07.2014
comment
Действительно, с symlink_status() is_symlink() возвращает true. Но там мы должны знать состояние файла перед запуском ... как я могу узнать, является ли файл обычным или символической ссылкой во время выполнения? - person StormRider; 23.07.2014
comment
всегда используйте symlink_status(), он возвращает то же, что и status(), за исключением символической ссылки. - person Alper; 23.07.2014
comment
Вот и все ! symlink_status() работает. Спасибо ! Но почему status() не возвращает правильный тип файла? - person StormRider; 23.07.2014
comment
Можно перейти по символической ссылке и определить атрибуты целевого/реального файла. Boost предоставляет 2 функции symlink_status() и status() для обеспечения обеих функций. - person Alper; 23.07.2014

В коде у вас link_name, в файловой системе у вас link-name.

person Wojtek Surowka    schedule 23.07.2014