web-dev-qa-db-ja.com

boost :: filesystem :: pathで絶対パスを取得します

現在の作業ディレクトリは/home/myuser/programにあり、それを指すboost::filesystem::pathオブジェクトを作成しました。 /../somedirを追加したので、/home/myuser/program/../somedirになります。ただし、/home/myuser/somedirに解決される絶対パスを取得する必要があります。

私は長い間試してきましたが、 参照 にこれを行う方法が見つかりません。 make_absoluteと呼ばれるメソッドがあり、これは私が期待することを行うように思われるが、「ルート」パス引数を与えなければならない。どっちがいい?実際の絶対パスを取得するために本当にこれを行う必要がありますか?他の方法はありますか?

31
Mario

あなたは絶対パスが欲しいと言いますが、あなたの例はあなたがすでに絶対パスを持っていることを示しています。パスの_.._コンポーネントを削除するプロセスは、canonicalizationと呼ばれます。そのためには、 canonical を呼び出す必要があります。たまたまabsoluteのタスクも実行するため、最初にabsoluteや_make_absolute_を呼び出す必要はありません。 _make_absolute_関数にはベースパスが必要です。より良いものがない場合は、current_path()を渡すことができます。

23
Rob Kennedy

更新、これはまだ絶対パスに関するGoogleのトップヒットであると思われるため:

Boost 1.57以降、以前に提案された機能の一部は削除されました。

私のために働いた解決策は

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);

(boost/filesystem.hppで自動的に含まれるboost/filesystem/operations.hppで定義されている独立したメソッド canonical() を使用)

重要:存在しないパス(たとえば、ファイルを作成する)でcanonicalを呼び出すと、例外がスローされます。その場合、次の最善策はおそらくboost :: filesystem :: absolute()です。存在しないパスでも機能しますが、パスの中央にあるドットを削除しません(a/b/c /../../ d.txtのように)。注:ファイルを参照するパスでparent_path()を呼び出して、relativeToがディレクトリを参照していることを確認してください(たとえば、ディレクトリまたは自身に関連するファイルパスを含む開かれたファイル)。

11
Daniel

ドキュメントが示す _make_absolute_には、現在のパスをデフォルトとするoptional2番目のパラメーターがあります:

path absolute(const path& p, const path& base=current_path());

2番目のパラメーターなしで試してみて、探している結果が返されるかどうかを確認します。

1
Mr. Llama

「ルート」パス引数を指定する必要があります。

ドキュメントを確認してください: あなたは何も与えませんない;デフォルトの2番目のパラメーターがあります。つまり、現在のディレクトリ。

相対パスは、いくつかのディレクトリに相対的です。したがって、パスを絶対パスにする場合は、絶対パスとの相対関係を知る必要があります。それが「ルートパス」です。これは相対ディレクトリです。

0
Nicol Bolas