std::experimental::filesystem::absolute, std::experimental::filesystem::system_complete
From cppreference.com
< cpp | experimental | fs
| ヘッダー <experimental/filesystem> で定義されています |
||
| path absolute( const path& p, const path& base = current_path() ); |
(1) | (filesystem TS) |
| path system_complete( const path& p ); path system_complete( const path& p, error_code& ec ); |
(2) | (filesystem TS) |
1) p を base に相対的な絶対パスに変換します。以下の規則に従います。
- もし p がルート名とルートディレクトリの両方を持つ場合(例: "C:\users")、パスは変更されずに返されます。
- もし p がルート名を持つが、それに続くルートディレクトリがない場合(例: "C:text.txt")、base が p のルート名と p の残りの部分の間に挿入されます。形式的には、p.root_name() / fs::absolute(base).root_directory() / fs::absolute(base).relative_path() / p.relative_path() が返されます。
- もし p がルート名を持たないが、ルートディレクトリを持つ場合(例:POSIX システムでは "/var/tmp/file.txt"、Windows では "\users\ABC\Document.doc")、base のルート名(もしあれば)が p の前に付けられます(POSIX システムでは p は変更されません。Windows システムでは "\users\ABC\Document.doc" は "C:\users\ABC\Document.doc" になります)。形式的には、fs::absolute(base).root_name() / p が返されます。
- もし p がルート名もルートディレクトリも持たない場合(例: "../file.txt")、base 全体が p の前に付けられます。形式的には、absolute(base) / p が返されます。
2) OS のファイルオープン API がパス名 p でアクセスするファイルを示す絶対パスを取得します。POSIX システムでは、これはデフォルトの base(
fs::current_path())を使用した (1) と同等です。Windows システムでは、各論理ドライブは独自の現在の作業ディレクトリを持ちます。そのため、もし p がまだ絶対パスでなく、ルート名コンポーネントを持つ場合(例: "E:filename.txt")、そのドライブの現在の作業ディレクトリが使用されます。これは、以前に実行されたプログラムによって設定されたものである可能性があります。目次 |
[編集] Parameters
| p | - | 絶対形式に変換するパス |
| base | - | 開始位置として機能する(必ずしも絶対パスである必要はない)パス |
| エラーコード | - | 例外を投げないオーバーロードでのエラー報告のための出力パラメータ |
[編集] Return value
上記のように p と base を組み合わせて形成された、絶対パス(ただし、必ずしも正規化されているとは限らない)を返します。
[編集] Exceptions
error_code& パラメータを取らないオーバーロードは、基盤となる OS API エラーが発生した場合に filesystem_error をスローします。この例外は、最初の引数に p、2番目の引数に base、エラーコード引数に OS エラーコードを指定して構築されます。std::bad_alloc は、メモリ割り当てに失敗した場合にスローされる可能性があります。error_code& パラメータを取るオーバーロードは、OS API 呼び出しが失敗した場合にそれを OS API エラーコードに設定し、エラーが発生しなかった場合は ec.clear() を実行します。このオーバーロードはnoexcept 指定:
noexcept
[編集] Notes
ルート名をサポートするシステム(例:Windows)では、ルート名を持つ相対パス(例: "D:file.txt")に対して absolute を呼び出した場合、base のルート名が異なる場合、通常は存在しないパスになります。
[編集] Example
このコードを実行
#include <filesystem> #include <iostream> namespace fs = std::experimental::filesystem; int main() { fs::path p = "C:cl.exe"; std::cout << "Current path is " << fs::current_path() << '\n' << "Absolute path for " << p << " is " << fs::absolute(p) << '\n' << "System complete path for " << p << " is " << fs::system_complete(p) << '\n'; }
実行結果の例
Current path is "D:/local/ConsoleApplication1" Absolute path for "C:cl.exe" is "C:/local/ConsoleApplication1/cl.exe" System complete path for "C:cl.exe" is "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cl.exe"
[編集] See also
| 正規パスを構成する (関数) |