web-dev-qa-db-ja.com

Boost.FilesystemとC ++標準ファイルシステムライブラリはどの程度似ていますか?

C++ 11対応のコンパイラまたはC++ 14対応のコンパイラで使用するためのファイルシステムライブラリが必要です。C++ 17からのものにすることはできません。

今、私はC++ 17に入るファイルシステムライブラリがBoost :: Filesystemに基づいていることを知っています。しかし、それらは、Boostライブラリを使用して、後でusingステートメントを変更することなく、後で標準バージョンにシームレスに切り替えるのに十分似ていますか?または、2つの間に(マイナー/重要な)違いはありますか? variantの場合、Boostと標準ライブラリのバージョンはかなり異なります。

26
einpoklum

いくつかの違いがあります。一部には、伝播されなかったBoostの変更があったと思います。たとえば、path.filename_is_dot()クエリはありません(以下で説明するように、_std::filesystem_ではとにかくあまり役​​に立ちません)。

この前線には、最新のニュースもかなりありました。

  1. non-POSIX-like filesystems :のサポート
    • 文字列がOSネイティブかPOSIXライクかを指定します(または実装に決定を任せます。これは(まだ)デフォルトです)
    • 実装では、追加のファイルタイプを定義する場合があります(通常、ディレクトリ、ソケット以外のなど
    • 実装では、ディレクトリまたはデバイスファイルに対して_file_size_を定義できます。
  2. filename()、正規化、および相対/絶対変換が再定義されました (POSIXの例):
    • path("foo/.").lexically_normal()=="foo/"(Boostでは反対です)
    • path("foo/").filename()==""(Boostではpath(".")です)
    • remove_filename()は末尾のスラッシュを残し、したがってべき等です(Boostでparent_path()を割り当てます)
    • path(".profile").extension()==""(Boostでの名前全体)
    • pathの分解と組み合わせにより、 代替データストリーム名 のような、通常は表示されないものを保持できます。
    • path("foo")/"/bar"=="/bar"(is path("foo/bar") in Boost)、相対ファイル名を他のファイル名(絶対または相対)で構成できるようにし、Boostのabsolute()を置き換えます
    • Boostのsystem_complete()(引数を1つだけ取る)はabsolute()に名前が変更されました
    • したがって、canonical()は1つの引数のみを受け取ります( [〜#〜] dr [〜#〜] で修正)
    • lexically_relative()は_.._およびルート要素を正しく処理します
    • permissions()はより多くの引数を取ります(Boostはそれらをビットマスクに結合します)

Boost.Filesystem v4は 開発中 であり、C++ 17互換であると想定されています(したがって、v3との多くの点で互換性がありません)。

18
Davis Herring

警告:この回答は、C++ 17が確定する前の最後のいくつかの変更を反映していません。 @DavisHerringの回答を参照してください。


Boostファイルシステムインサーターとエクストラクターは、&"のエスケープ文字として&を使用します。

標準は std::quoted (デフォルトでは\を使用)を使用して"をエスケープし、次に\\を使用して\をエスケープします。 このリファレンス を参照してください。

デモ

それはおそらくそれらの間の唯一の違いです。

その違いの理由は N3399 にあります

6
Danh