2012-09-28 28 views
24

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

私は長い間努力してきましたが、私はtheir referenceにこれを行う方法が見つかりませんでした。 make_absoluteと呼ばれるメソッドがありますが、これは私が期待していると思われるものですが、 "ルート"パス引数を与えなければなりません。それはどれでしょうか?本当の絶対的な道を得るためには本当にこれを行う必要がありますか?他の方法はありますか? make_absoluteオプション二番目のパラメータを持ってい

答えて

21

あなたは絶対パスが必要だと言っていますが、あなたの例では絶対パスが既に存在することを示しています。パスのコンポーネントを削除するプロセスは、正規化として知られています。そのためには、canonicalに電話する必要があります。 absoluteのタスクも実行するので、absoluteまたはmake_absoluteを最初に呼び出す必要はありません。 make_absolute関数には基本パスが必要です。あなたはそれ以上のものがなければそれをcurrent_path()に渡すことができます。

+0

注意。私はそれが例えばシンボリックリンクなどを解決することを意味するかどうかわからないので、 "canonical"という言葉を使いたくなかった。私はあなたの提案を試み、それはすぐに働いた。ありがとう。 – Mario

+3

fileが存在しない場合、canonical throws例外に注意してください。既存のパスのみを構築することができます。 –

1

documentation showsそのあなたの現在のパスデフォルト:

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

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

+0

これは私を少し悩ませた矛盾の1つです。 1つのパラメータを持つ 'make_absolute'メソッドがあります。リンクをたどると、2つのパラメータを受け入れる' absolute() '関数のドキュメントに私を誘導します。それでも 'absolute(pathObject).string()'のようにすると、未解決の同じパスが返されます。これはあなたが提案したものです、そうですか? – Mario

0

私はそれに "root"パス引数を与えなければなりません。あなたはがそれに何かを与えることをを持っていない

Check the docs:。それにはデフォルトの第2パラメータがあります。つまり、現在のディレクトリです。

相対パスは一部のディレクトリからの相対パスです。したがって、絶対パスを作成するときは、を基準にして絶対パスを指定する必要があります。これが「ルートパス」です。相対パスのディレクトリです。

9

更新これはまだ絶対パスに関するGoogleのトップヒットのように見えることから、:ブースト1.57のよう

、以前に示唆した機能の一部はその後削除されました。

私のために働いた溶液(自動的にブースト/ filesystem.hpp介し含まれてブースト/ファイルシステム/ operations.hppで定義された自立方法canonical()を、使用して)

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

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

+0

"previousPath"と "relativeTo"のパス文字列の例は何ですか?入力がパススタイルのように見える必要があるかどうかはわかりません。 –

+0

以前のパスはrelativeTo = path( "c:/ example/test/blah")でpath( "../../ readme.txt")のようなものになります。これは "c:/ example/readme"に解決されます。 TXT"。 relativeToが何をするのか(または分かりやすい入力が必要な場合でも)、前のパスがすでに絶対パスであるかどうかはわかりません。 – Daniel

関連する問題