Хорошо ли определено поведение ifstream :: ifstream для каталогов? - PullRequest
0 голосов
/ 10 октября 2018

Согласно стандарту C ++ 11 , задано ли поведение

ifstream in(".");

или оно зависит от системы?

Для контекста Iя пытаюсь избежать использования boost::filesystem и подобных библиотек, потому что они вызывают несвязанные проблемы с переносимостью.

Редактировать: В соответствии с тем, что я могу найти, я должен получить действительный ifstream (тот, который 'good ()', еслии только если каталог существует. Это потенциально дает более портативный способ проверить, существует ли каталог, чем использование boost::filesystem, потому что последний требует, чтобы вы связались с большим количеством библиотек.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

В зависимости от того, что я могу найти, я должен получить действительный ifstream (тот, который good(), если и только если каталог существует.

Этот результат не гарантируетсяпо стандарту. Я бы не стал использовать его в качестве механизма для проверки существования каталога.

Когда вы ограничены использованием C ++ 11, лучшим вариантом будет использование зависимых от платформы вызовов API, окруженных соответствующимимакросы препроцессора.

#if  defined(_WINDOWS)
// Use Windows specific APIs
#elif defined(_Linux)
// Use Linux specific APIs
#elif defined(_MacOS) ???
// Use MacOS specific APIs
#endif

Дополнительная информация:

Для Windows: Как проверить, существует ли каталог в Windows в C?
Для Linux: Проверка наличия каталога в Unix (системный вызов)

0 голосов
/ 10 октября 2018

В стандарте, похоже, нет упоминания о понятии «каталог» нигде в его прозе.Существует упоминание об EISDIR errno и общем намерении отразить posix, но только «может использовать для сообщения о низкоуровневых условиях».Я бы сказал, системно-зависимый, а не переносимый.

...