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

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

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


person einpoklum    schedule 30.11.2016    source источник


Ответы (2)


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

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

  1. Support for non-POSIX-like filesystems:
    • Specify whether a string is OS-native or POSIX-like (or let the implementation decide, which is (still) the default)
    • Реализация может определять дополнительные типы файлов (помимо обычных файлов, каталогов, сокетов, и т. Д.)
    • Реализация может определять file_size для каталога или файла устройства
  2. filename(), normalization, and relative/absolute conversions redefined (examples for POSIX):
    • path("foo/.").lexically_normal()=="foo/" (is the opposite in Boost)
    • path("foo/").filename()=="" (path(".") в режиме Boost)
    • remove_filename() оставляет завершающую косую черту и, таким образом, является идемпотентным (присваивает parent_path() в Boost)
    • path(".profile").extension()=="" (это полное имя в Boost)
    • path декомпозиции и комбинации могут сохранять такие вещи, как альтернативные имена потоков данных, которые обычно невидимый
    • path("foo")/"/bar"=="/bar" (path("foo/bar") в Boost), который позволяет составлять относительные имена файлов с другими (абсолютными или относительными) и заменяет absolute() в Boost
    • system_complete() Boost (который принимает только один аргумент) переименован в absolute()
    • canonical(), таким образом, принимает только один аргумент (фиксируется в DR)
    • lexically_relative() правильно обрабатывает .. и корневые элементы
    • permissions() принимает больше аргументов (Boost объединяет их в битовую маску)

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

person Davis Herring    schedule 18.09.2017
comment
Можете ли вы немного уточнить, помимо ссылки? Кроме того, не применяются ли эти изменения также к файловой системе Boost? - person einpoklum; 18.09.2017
comment
Итак, считается ли файловая система Windows не-POSIX из-за дисков и обратной косой черты? Или мы о другом говорим? - person einpoklum; 19.09.2017
comment
Windows - это POSIX, несмотря на диски (которые фактически имеют аналогию с POSIX в //worms/share/foo) и обратную косую черту, но только потому, что некоторые необычные вещи, такие как имена ADS, либо игнорируются, либо скрываются реализацией. (Не-POSIX включает такие вещи, как отсутствие относительных путей или что-то в этом роде.) - person Davis Herring; 19.09.2017
comment
C: \ - прекрасное имя файла в POSIX, и я достаточно уверен, что Windows не может справиться с этим и многими другими именами файлов и функциями POSIX, поэтому, хотя его можно эмулировать, окна (подсистема win32), безусловно, не POSIX. - person Remember Monica; 21.12.2018
comment
@MarcLehmann: Конечно, но как это повлияет на утверждение, что для целей структуры файловой системы этот интерфейс считает его POSIX-подобным? - person Davis Herring; 21.12.2018
comment
Список отличий намного длиннее. Например, функция copy_directory() даже не существует в std :: filesystem. - person BЈовић; 03.09.2019
comment
@ BЈовић: он был заменен на перегрузку create_directory как в документации сказано, что так и должно быть. Я не знаю, заслуживает ли это особого внимания или нет. - person Davis Herring; 24.09.2019

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


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

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

Демо

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

Причину такой разницы можно найти на странице N3399.

person Danh    schedule 01.12.2016
comment
На самом деле я не нахожу объяснения по ссылке, зачем вообще использовать & в качестве escape-символа, что мне кажется очень странным. Но спасибо. - person einpoklum; 01.12.2016
comment
@einpoklum Народ Boost долгое время использовал &, я не знаю, почему они выбрали его, вряд ли они его изменят. Стандартные люди хотят сделать его единообразным для всей библиотеки. - person Danh; 01.12.2016
comment
Наверное, это единственное различие между ними. Это далеко не так. - person cpplearner; 26.01.2017