Подтвердить что ты не робот

Насколько похожи файловые системы Boost и стандартные библиотеки файловой системы С++?

Мне нужна библиотека файловой системы для использования с компилятором, совместимым с С++ 11, или с С++ 14-совместимым, поэтому он не может быть с С++ 17.

Теперь я знаю, что библиотека файловой системы, идущая на С++ 17, основана на Boost:: Filesystem; но - они достаточно похожи для меня, чтобы использовать библиотеку Boost, а затем легко переключаться на стандартную версию позже, не меняя больше, чем, скажем, инструкцию using? Или существуют (незначительные/значимые) различия между этими двумя? Я знаю, что для случая variant версии Boost и стандартной библиотеки немного отличаются.

4b9b3361

Ответ 1

Существует несколько отличий. Некоторые из них, я считаю, усиливают изменения, которые никогда не распространялись. Например, нет запроса path.filename_is_dot() (как обсуждается ниже, это было бы менее полезно в std::filesystem) в любом случае.

На этом фронте также были хорошие новости:

  • Поддержка не-POSIX-подобных файловых систем:
    • Укажите, является ли строка ОС-родной или POSIX-подобной (или разрешить реализации, которая (по-прежнему) по умолчанию)
    • Реализация может определять дополнительные типы файлов (помимо обычных, директорий, сокетов и т.д.).
    • Реализация может определить file_size для каталога или файла устройства
  • filename(), нормализация и относительные/абсолютные преобразования переопределены (примеры для POSIX):
    • path("foo/.").lexically_normal()=="foo/" (противоположно в Boost)
    • path("foo/").filename()=="" (есть path(".") в Boost)
    • remove_filename() оставляет конечную косую черту и, следовательно, является идемпотентным (он назначает parent_path() в Boost)
    • path(".profile").extension()=="" (это полное имя в Boost)
    • path Разложения и комбинации могут сохранять такие вещи, как альтернативные имена потоков данных, которые обычно невидимы
    • path("foo")/"/bar"=="/bar" (есть path("foo/bar") в Boost), что позволяет составлять относительные имена файлов с другими (абсолютными или относительными) и заменяет Boost absolute()
    • Boost system_complete() (который принимает только один аргумент) переименовывается в absolute()
    • canonical(), таким образом, принимает только один аргумент (фиксированный в DR)
    • lexically_relative() правильно обрабатывает .. и корневые элементы
    • permissions() принимает больше аргументов (Boost объединяет их в битовую маску)

Обратите внимание, что Boost.Filesystem v4 находится в разработке и должен быть совместим с С++ 17 (но, следовательно, несовместим во многих отношениях с v3).

Ответ 2

Предостережение:. Этот ответ не отражает несколько изменений в последнюю минуту до того, как был завершен С++ 17. См. Ответ @DavisHerring.


Вставка и извлечение файловой системы Boost используют & как escape-символ для " и &.

Стандарт будет использовать std::quoted (который по умолчанию использует \), чтобы выйти ", который, в свою очередь, использует \\ для выхода \, см. эта ссылка.

Демо

Вероятно, это единственное различие между ними.

Причину этой разницы можно найти в N3399