Spec-Zone.ru › C++

std::filesystem::rename

Определён в заголовочном файле <filesystem>
void rename( const std::filesystem::path& old_p,
             const std::filesystem::path& new_p );
(1) (начиная с C++17)
void rename( const std::filesystem::path& old_p,
             const std::filesystem::path& new_p,
             std::error_code& ec ) noexcept;
(2) (начиная с C++17)

Перемещает или переименовывает объект файловой системы, указанный в old_p, в new_p, как если бы это выполнялось с помощью POSIX-функции rename:

  • Если old_p — файл, не являющийся каталогом, то new_p должен быть одним из следующих вариантов:
    • тот же файл, что и old_p, или жёсткая ссылка на него: в этом случае ничего не происходит.
    • существующий файл, не являющийся каталогом: сначала удаляется new_p, затем, не позволяя другим процессам увидеть new_p удалённым, путь new_p связывается с файлом, а old_p отвязывается от файла. Требуются права на запись в каталог, содержащий old_p, и в каталог, содержащий new_p.
    • несуществующий файл в существующем каталоге: путь new_p связывается с файлом, а old_p отвязывается от файла. Требуются права на запись в каталог, содержащий old_p, и в каталог, содержащий new_p.
  • Если old_p — каталог, то new_p должен быть одним из следующих вариантов:
    • тот же каталог, что и old_p, или жёсткая ссылка на него: в этом случае ничего не происходит.
    • существующий каталог: new_p удаляется, если он пуст, в POSIX-системах, но в других системах это может привести к ошибке. Если ошибки нет, сначала удаляется new_p, затем, не позволяя другим процессам увидеть new_p удалённым, путь new_p связывается с каталогом, а old_p отвязывается от каталога. Требуются права на запись в каталог, содержащий old_p, и в каталог, содержащий new_p.
    • несуществующий каталог, имя которого не заканчивается разделителем каталогов и родительский каталог которого существует: путь new_p связывается с каталогом, а old_p отвязывается от каталога. Требуются права на запись в каталог, содержащий old_p, и в каталог, содержащий new_p.
  • Символические ссылки не разыменовываются: если old_p — символическая ссылка, переименовывается она сама, а не её цель. Если new_p — существующая символическая ссылка, удаляется она сама, а не её цель.

Переименование завершается ошибкой, если

  • new_p заканчивается на точку или две точки.
  • new_p указывает на несуществующий каталог и заканчивается разделителем каталогов.
  • old_p является каталогом, предком которого является new_p.

Параметры

old_p - путь для перемещения или переименования
new_p - целевой путь для операции перемещения или переименования
ec - выходной параметр для сообщения об ошибке в невыбрасывающей исключения перегрузке

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

(нет)

Исключения

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

1) Выбрасывает std::filesystem::filesystem_error при ошибках базового API ОС; объект исключения создаётся с old_p в качестве первого аргумента-пути, new_p в качестве второго аргумента-пути и кодом ошибки ОС в качестве аргумента кода ошибки.
2) Устанавливает параметр std::error_code& в код ошибки API ОС, если вызов API ОС завершается ошибкой, и выполняет ec.clear(), если ошибок не возникает.

Пример

#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;

int main()
{
    std::filesystem::path p = std::filesystem::current_path() / "sandbox";
    std::filesystem::create_directories(p / "from");
    std::ofstream{ p / "from/file1.txt" }.put('a');
    std::filesystem::create_directory(p / "to");

//  fs::rename(p / "from/file1.txt", p / "to/"); // error: "to" is a directory
    fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // OK
//  fs::rename(p / "from", p / "to"); // error: "to" is not empty
    fs::rename(p / "from", p / "to/subdir"); // OK

    std::filesystem::remove_all(p);
}

См. также

rename
переименовывает файл
(функция)
removeremove_all
(C++17)(C++17)
удаляет файл или пустой каталог
удаляет файл или каталог и всё его содержимое рекурсивно
(функция)

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

Spec-Zone.ru

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