32

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

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

4

5 に答える 5

24

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

于 2012-09-28T16:49:28.850 に答える
13

これは絶対パスに関してGoogleのトップヒットであるように見えるので、更新してください。

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

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

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

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

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

于 2014-12-15T13:54:41.580 に答える
1

ドキュメントには、デフォルトで現在のパスに設定されるオプションの2番目のパラメータがあることが示さmake_absoluteます。

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

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

于 2012-09-28T16:32:06.903 に答える
0

私はそれに「ルート」パス引数を与えなければなりません。

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

相対パスは、あるディレクトリからの相対パスです。したがって、パスを絶対パスにするときは、パスに対して絶対パスが何であるかを知る必要があります。これが「ルートパス」、つまり相対的なディレクトリです。

于 2012-09-28T16:32:24.777 に答える
0
// input: d:\\tmp\\\\a/../VsDebugConsole.png
// output: d:\\tmp\\VsDebugConsole.png
static std::wstring fix_path(std::wstring path)
{
    //boost::replace_all(path, L"\\\\", L"\\");
    //boost::replace_all(path, L"//", L"/");
    boost::filesystem::path bpath(path);
    bpath = boost::filesystem::system_complete(bpath);

    return bpath.wstring();
}
于 2021-01-15T08:26:45.877 に答える