Spec-Zone.ru › C++

std::filesystem::relative, std::filesystem::proximate

Defined in header <filesystem>
path relative( const std::filesystem::path& p,
               std::error_code& ec );
(1) (since C++17)
path relative( const std::filesystem::path& p,
               const std::filesystem::path& base = std::filesystem::current_path() );
(2) (since C++17)
path relative( const std::filesystem::path& p,
               const std::filesystem::path& base,
               std::error_code& ec );
(3) (since C++17)
path proximate( const std::filesystem::path& p,
                std::error_code& ec );
(4) (since C++17)
path proximate( const std::filesystem::path& p,
                const std::filesystem::path& base = std::filesystem::current_path() );
(5) (since C++17)
path proximate( const std::filesystem::path& p,
                const std::filesystem::path& base,
                std::error_code& ec );
(6) (since C++17)
1) Возвращает relative(p, current_path(), ec).
2,3) Возвращает p, относящуюся к base. Разрешает символические ссылки и приводит в нормальную форму как p, так и base перед дальнейшей обработкой. Эффективно возвращает std::filesystem::weakly_canonical(p).lexically_relative(std::filesystem::weakly_canonical(base)) или std::filesystem::weakly_canonical(p, ec).lexically_relative(std::filesystem::weakly_canonical(base, ec)), за исключением формы с кодом ошибки, которая возвращает path() при первой ошибке, если таковая имеется.
4) Возвращает proximate(p, current_path(), ec).
5,6) Эффективно возвращает std::filesystem::weakly_canonical(p).lexically_proximate(std::filesystem::weakly_canonical(base)) или std::filesystem::weakly_canonical(p, ec).lexically_proximate(std::filesystem::weakly_canonical(base, ec)), за исключением формы с кодом ошибки, которая возвращает path() при первой ошибке, если таковая имеется.

Параметры

p - существующий путь
base - базовый путь, относительно которого p будет сделана относительной/ближайшей
ec - код ошибки для хранения состояния ошибки

Возвращаемое значение

1) p относительно current_path().
2,3) p относительно base.
4) p близка к current_path().
5,6) p близка к base.

Исключения

Любой перегруз, не помеченный noexcept, может вызвать std::bad_alloc, если выделение памяти не удалось.

2,5) Выбрасывает std::filesystem::filesystem_error при ошибках в базовой API ОС, созданной с p в качестве первого аргумента пути, base в качестве второго аргумента пути и кодом ошибки ОС в качестве аргумента ошибки.
1,3,4,6) Устанавливает параметр std::error_code& в код ошибки API ОС, если вызов API ОС завершился ошибкой, и выполняет ec.clear(), если ошибок не возникло.

Пример

#include <filesystem>
#include <iostream>
 
void show(std::filesystem::path x, std::filesystem::path y)
{
    std::cout << "x:\t\t " << x << "\ny:\t\t " << y << '\n'
              << "relative(x, y):  "
              << std::filesystem::relative(x, y) << '\n'
              << "proximate(x, y): "
              << std::filesystem::proximate(x, y) << "\n\n";
}
 
int main()
{
    show("/a/b/c", "/a/b");
    show("/a/c", "/a/b");
    show("c", "/a/b");
    show("/a/b", "c");
}

Возможный вывод:

x:               "/a/b/c"
y:               "/a/b"
relative(x, y):  "c"
proximate(x, y): "c"
 
x:               "/a/c"
y:               "/a/b"
relative(x, y):  "../c"
proximate(x, y): "../c"
 
x:               "c"
y:               "/a/b"
relative(x, y):  ""
proximate(x, y): "c"
 
x:               "/a/b"
y:               "c"
relative(x, y):  ""
proximate(x, y): "/a/b"

См. также

path
(C++17)
представляет путь
(класс)
absolute
(C++17)
составляется абсолютный путь
(функция)
canonicalweakly_canonical
(C++17)
составляется канонический путь
(функция)
lexically_normallexically_relativelexically_proximate
преобразует путь в нормальную форму
преобразует путь в относительную форму
преобразует путь в близкую форму
(публичный член-функция std::filesystem::path)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/filesystem/relative

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API