web-dev-qa-db-ja.com

C ++ 17でboost :: filesystem :: unique_path()に相当するものは何ですか?

C++ 17の_std::filesystem_、および多くのC++ 17以前のコンパイラの_std::experimental::filesystem_は、_boost::filesystem_に基づいており、ほとんどすべてが新しいstdに移植できます。

しかし、boost::filesystem::unique_path()に相当する_std::filesystem_はありません。

Stdに私が気づいていない同等のものはありますか?または、実装を模倣するために私が取るべき推奨されるアプローチはありますか?

私のコードが_boost::filesystem_をサポートするプラットフォームでコンパイルしていることにコードが気付いたとき、_std::filesystem_依存関係を置き換えたいと思っています。変換の明白な部分はunique_path()だけです。

24
Larry Gritz

unique_pathは、マルウェアに対する潜在的な攻撃経路だったため、削除されました。 unique_pathを呼び出してからその場所でファイルを開くまでの間に、他のプロセスが同じファイルを作成する可能性があります。ユーザーがファイルをどうするかによって、これはセキュリティの脆弱性を構成する場合としない場合があります。 POSIX関数 tmpnam にも同様の問題があります。

この説明 で述べたように、この問題は Filesystem ライブラリの次の反復で処理されます。それまでは、 Boost.Filesystem を引き続き使用するか、 std::tmpnam で提供される <cstdio> 関数を使用するか、または mkstemp のような、プラットフォーム固有の安全な代替手段を使用します。

21
Joseph Thomson

私が知る限り、C++ 17にはまったく同じものはありません。

実際に何をしたいかを具体的に指定していませんが、一時ファイルをどこかに保存する必要がある場合、同様の機能を模倣できるはずです。ランダムに生成されたファイル名を追加できるstd::filesystem::temp_directory_pathを使用した機能(これは これのように)できます 、またはboost::filesystem::unique_path()とまったく同じ命名形式が必要な場合はそれに応じて変更します)

または、any一時ファイルを保存するだけの場合は、std::tmpfileを使用できます。

4
user2047610