< cpp‎ | experimental‎ | fs
Technical specifications
Filesystem library (filesystem TS)
Library fundamentals (library fundamentals TS)
Library fundamentals 2 (library fundamentals 2 TS)
Extensions for parallelism (parallelism TS)
Extensions for parallelism 2 (parallelism TS v2)
Extensions for concurrency (concurrency TS)
Concepts (concepts TS)
Ranges (ranges TS)
Special mathematical functions (special math TR)
Defined in header <experimental/filesystem>
path canonical( const path& p, const path& base = current_path() );
(1) (filesystem TS)
path canonical( const path& p, error_code& ec );
(2) (filesystem TS)
path canonical( const path& p, const path& base, error_code& ec );
(3) (filesystem TS)

Converts path p to a canonical absolute path, i.e. an absolute path that has no dot, dot-dot elements or symbolic links.

If p is not an absolute path, the function behaves as if it is first made absolute by absolute(p, base) or absolute(p) for (2)

The path p must exist.


[edit] Parameters

p - a path which may be absolute or relative to base, and which must be an existing path
base - base path to be used in case p is relative
ec - error code to store error status to

[edit] Return value

An absolute path that resolves to the same file as absolute(p, base) (or absolute(p) for (2)).

[edit] Exceptions

The overload that does not take a error_code& parameter throws filesystem_error on underlying OS API errors, constructed with p as the first argument, base as the second argument, and the OS error code as the error code argument. std::bad_alloc may be thrown if memory allocation fails. The overload taking a error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. This overload has
noexcept specification:  

This function is modeled after the POSIX realpath.

[edit] Example

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
    fs::path p = fs::path("..") / ".." / "AppData";
    std::cout << "Current path is " << fs::current_path() << '\n'
              << "Canonical path for " << p << " is " << fs::canonical(p) << '\n';

Possible output:

Current path is "C:\Users\abcdef\AppData\Local\Temp"
Canonical path for "..\..\AppData" is "C:\Users\abcdef\AppData"

[edit] See also

represents a path
(class) [edit]
composes an absolute path
converts a path to an absolute path replicating OS-specific behavior
(function) [edit]