現在の作業ディレクトリは/home/myuser/program
にあり、それを指すboost::filesystem::path
オブジェクトを作成しました。 /../somedir
を追加したので、/home/myuser/program/../somedir
になります。ただし、/home/myuser/somedir
に解決される絶対パスを取得する必要があります。
私は長い間試してきましたが、 参照 にこれを行う方法が見つかりません。 make_absolute
と呼ばれるメソッドがあり、これは私が期待することを行うように思われるが、「ルート」パス引数を与えなければならない。どっちがいい?実際の絶対パスを取得するために本当にこれを行う必要がありますか?他の方法はありますか?
あなたは絶対パスが欲しいと言いますが、あなたの例はあなたがすでに絶対パスを持っていることを示しています。パスの_..
_コンポーネントを削除するプロセスは、canonicalizationと呼ばれます。そのためには、 canonical
を呼び出す必要があります。たまたまabsolute
のタスクも実行するため、最初にabsolute
や_make_absolute
_を呼び出す必要はありません。 _make_absolute
_関数にはベースパスが必要です。より良いものがない場合は、current_path()
を渡すことができます。
更新、これはまだ絶対パスに関する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がディレクトリを参照していることを確認してください(たとえば、ディレクトリまたは自身に関連するファイルパスを含む開かれたファイル)。
ドキュメントが示す _make_absolute
_には、現在のパスをデフォルトとするoptional2番目のパラメーターがあります:
path absolute(const path& p, const path& base=current_path());
2番目のパラメーターなしで試してみて、探している結果が返されるかどうかを確認します。
「ルート」パス引数を指定する必要があります。
ドキュメントを確認してください: あなたは何も与えませんない;デフォルトの2番目のパラメーターがあります。つまり、現在のディレクトリ。
相対パスは、いくつかのディレクトリに相対的です。したがって、パスを絶対パスにする場合は、絶対パスとの相対関係を知る必要があります。それが「ルートパス」です。これは相対ディレクトリです。