2017-09-06 7 views
2

C++ 17ファイルシステムライブラリでは、std::filesystem::remove(path)を取得しました。私が理解するように、Boost.Filesystemのboost::filesystem::remove(path)の直接ポートです。std :: removeとboost :: filesystem :: removeの違いは?

C++から継承したC++は、std::remove(path)という非常によく似た関数で、でもというファイルシステムからファイルを削除する方法として文書化されています。私は、この機能でいくつかの落とし穴を漠然と認識しています。私はWindowsでstd::removeは、現在のプロセスによって開いて保持されているファイルを削除するために使用することはできないと聞いたと思う。

std::filesystem::removeは、これらの問題をstd::removeで修正していますか? std::removeよりstd::filesystem::removeを好むべきですか?あるいは、前者は後者の名前空間の同義語で、同じ疣贅と落とし穴がありますか?私はstd::filesystem::remove(path)はまだライブラリベンダーの多くで実装されていない可能性があること理解ので

私の質問のタイトルはboost::filesystem::remove(path)std::remove(path)との違いを尋ねたが、私の理解では、基本的に直接コピーすることになっていますということですブーストバージョン。あなたがWindows上のBoost.Filesystemについて知っているなら、おそらくあなたはこの質問に答えるのに十分なことを知っているでしょう。

+1

'boost :: filesystem :: remove'のソースを調べて[単にDeleteFileW'を呼び出していることを知りました](https://github.com/boostorg/filesystem/blob/07619fb37007f45b54bc71877e724c8f4b014c9f/src /operations.cpp#L240)を実行します。 –

+1

'filesystem'関数は、注意を払うときに一般的なUnicodeパスを扱うことができます。特に、現在の実装では、UTF-8からのデフォルト変換に頼るのではなく、明示的にそれを行います。古い 'std :: remove'は狭い実行文字セットに限定されていますが、Windows実装がその実行文字セットがUTF-8であることが検出されたことは間違いありません。 Windowsでは、Windows ANSIの文字を含むパスのみを処理できます。これは、システム固有のエンコーディングです。 –

+0

@ Cheersandhth.-Alf:「実行文字セット」がUTF-8であることをWindows C++実装がどのように検出しますか?そのインプリメンテーションは、独自の実行セット(検出不要)を定義するか、Windows(UTF-8をデフォルトの文字セットとして使用できません)に向かいます。 – MSalters

答えて

2

単にWindowsのDeleteFileWを呼び出すだけで_wremoveを呼び出し、その内部_Unlinkヘルパーを呼び出し、std::experimental::filesystem::remove私のMSVC、一緒にインストール標準ライブラリのソースを確認します。同様に、boost::filesystem::removeはWindows上でDeleteFileWと呼ばれることもあります。


std::filesystem::removeis specified by reference to POSIX removeが、[fs.conform.9945]の世界的な文言は、実装が、正確なPOSIXの動作を提供するために必要とされていないことが明らかになります:それは POSIXで定義されるよう

実装は、そのような行動を提供する必要があります。実装は、 とは異なる動作を、POSIXによって定義された動作を文書化しなければならない。 の正確なPOSIX動作をサポートしていない実装では、実際の操作 システムおよびファイルシステムの制限を考慮すると、POSIX の動作に近い動作が得られるはずです。実装が妥当な動作を提供できない場合、実装は[fs.err.report]で指定されたエラーを報告しなければならない。 [注:[...]]

特定のファイルシステムでサポートされていない動作を実装する必要はありません。 [実施例:[...]] ::remove

任意癖(すなわち削除するファイルの識別を除去するのではなく、実際の行為についてである)により、基礎となるOSのAPIの制限の可能性があります。私は同じオペレーティングシステム上でstd::filesystem::removeの実装が魔法のほうが良いと思う理由はないと思う。

+0

Re:「同じOSでのstd :: filesystem :: removeの実装が魔法のほうがうまくいくとは思えません。」という質問にコメントしたように、 filesystem :: remove'は一般的なUnicodeパスを扱うことができます。これは機能のかなり大きな違いです。これは、 'std :: filesystem :: remove'がはるかに優れていることを意味します。 –

+0

@ Cheersandhth.-Alf:私の理解を確認すると、 'std :: remove'は' const char * 'を取るが、' fs :: remove'は 'fs :: path'をとります。基本的に 'basic_string '](http://en.cppreference.com/w/cpp/filesystem/path)? – Quuxplusone

+0

@Quuxplusone:はい。 –