Namespaces
Variants

std::filesystem:: rename

From cppreference.net
定义于头文件 <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 相同目录或为其硬链接:此情况下不执行任何操作。
  • 已存在目录:在 POSIX 系统上若 new_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 是已存在的符号链接,被删除的是该链接本身而非其目标。

重命名失败如果

  • new_p 点点 结尾。
  • new_p 指向一个以目录分隔符结尾的不存在的目录。
  • old_p 是一个目录,且为 new_p 的上级目录。

目录

参数

old_p - 要移动或重命名的路径
new_p - 移动/重命名操作的目标路径
ec - 非抛出重载中用于错误报告的输出参数

返回值

(无)

异常

任何未标记为 noexcept 的重载在内存分配失败时可能抛出 std::bad_alloc

1) 当底层操作系统API出错时抛出 std::filesystem::filesystem_error ,该异常以 old_p 作为第一个路径参数、 new_p 作为第二个路径参数,并将操作系统错误代码作为错误码参数构造。
2) 若操作系统API调用失败,将 std:: error_code & 参数设置为操作系统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/"); // 错误:"to"是目录
    fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // 正确
//  fs::rename(p / "from", p / "to"); // 错误:"to"非空
    fs::rename(p / "from", p / "to/subdir"); // 正确
    std::filesystem::remove_all(p);
}

参见

重命名文件
(函数)
(C++17) (C++17)
删除文件或空目录
递归删除文件或目录及其所有内容
(函数)