rename(2) - Linux man page

名称

rename - 更改文件的名称或位置

概要

#include <stdio.h>

int rename(const char *oldpath, const char *newpath);

描述

rename() 重命名一个文件,如果需要则将其在目录之间移动。使用 link(2) 创建的任何其他硬链接不受影响。oldpath 的打开文件描述符也不受影响。

如果 newpath 已经存在,它将被原子性地替换(在一些条件下;参见下面的错误部分),因此在任何时候,另一个尝试访问 newpath 的进程都不会发现它丢失。

如果 oldpathnewpath 是指向同一文件的现有硬链接,那么 rename() 什么也不做,并返回一个成功状态。

如果 newpath 存在,但操作由于某种原因失败,rename() 保证会保留 newpath 的一个实例。

oldpath 可以指定一个目录。在这种情况下,newpath 必须不存在,或者它必须指定一个空目录。

但是,在覆盖时,很可能会有一个窗口,在这个窗口中,oldpathnewpath 都指向正在重命名的文件。

如果 oldpath 指向一个符号链接,则重命名该链接;如果 newpath 指向一个符号链接,则会覆盖该链接。

返回值

成功时返回零。出错时返回 -1,并相应地设置 errno

错误

EACCES
拒绝对包含 oldpathnewpath 的目录的写入权限,或者拒绝对 oldpathnewpath 的路径前缀中的任何目录的搜索权限,或者 oldpath 是一个目录,并且不允许写入权限(需要更新 .. 条目)。(另请参见 path_resolution(7)。)
EBUSY
重命名失败,因为 oldpathnewpath 是某个进程正在使用的目录(可能是当前工作目录,或根目录,或者因为它被打开用于读取),或者被系统使用(例如作为挂载点),而系统认为这是一个错误。(请注意,没有要求在这种情况下返回 EBUSY——这样做并没有错——但是如果系统无法处理这种情况,则允许返回 EBUSY。)
EDQUOT
用户在文件系统上的磁盘块配额已用尽。
EFAULT
oldpathnewpath 指向您可访问地址空间之外的位置。
EINVAL
新的路径名包含旧路径名的路径前缀,或者,更一般地说,尝试将一个目录变成其自身的子目录。
EISDIR
newpath 是一个现有的目录,但 oldpath 不是一个目录。
ELOOP
在解析 oldpathnewpath 时遇到了太多的符号链接。
EMLINK
oldpath 已经具有最大数量的链接,或者它是一个目录,并且包含 newpath 的目录具有最大数量的链接。
ENAMETOOLONG
oldpathnewpath 太长。
ENOENT
oldpath 命名的链接不存在;或者,newpath 中的一个目录组件不存在;或者,oldpathnewpath 是一个空字符串。
ENOMEM
内核内存不足。
ENOSPC
包含该文件的设备没有足够的空间来创建新的目录条目。
ENOTDIR
用作 oldpathnewpath 中目录的组件不是一个实际的目录。或者,oldpath 是一个目录,并且 newpath 存在但不是一个目录。
ENOTEMPTYEEXIST
newpath 是一个非空目录,也就是说,包含除“.”和“..”以外的其他条目。
EPERMEACCES
包含 oldpath 的目录设置了粘滞位 (S_ISVTX),并且进程的有效用户 ID 既不是要删除文件的用户 ID,也不是包含它的目录的用户 ID,并且进程没有特权(Linux:没有 CAP_FOWNER 功能);或者 newpath 是一个现有文件,并且包含它的目录设置了粘滞位,并且进程的有效用户 ID 既不是要替换文件的用户 ID,也不是包含它的目录的用户 ID,并且进程没有特权(Linux:没有 CAP_FOWNER 功能);或者包含 pathname 的文件系统不支持所请求类型的重命名。
EROFS
文件位于只读文件系统上。
EXDEV
oldpathnewpath 不在同一个挂载的文件系统上。(Linux 允许将文件系统挂载在多个点上,但 rename() 不适用于不同的挂载点,即使相同的文件系统挂载在两者上。)

符合

4.3BSD, C89, C99, POSIX.1-2001。

错误

在 NFS 文件系统上,您不能假设如果操作失败,文件没有被重命名。如果服务器执行重命名操作然后崩溃,重新传输的 RPC 将在服务器启动后处理,导致失败。应用程序需要处理这种情况。有关类似问题,请参见 link(2)

参见

mv(1), chmod(2), link(2), renameat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

引用自

cpuset(7), explain(1), explain(3), explain_lca2010(1), explain_rename(3), explain_rename_or_die(3), git-read-tree(1), hdf_write_file_atomic(3), inotify(7), lsof(8), mksh(1), perlfunc(1), remove(3), rfrename(1), rmdir(2), star(1)