rename(2) - Linux man page
名称
rename - 更改文件的名称或位置概要
#include <stdio.h>int rename(const char *oldpath, const char *newpath);
描述
如果 newpath 已经存在,它将被原子性地替换(在一些条件下;参见下面的错误部分),因此在任何时候,另一个尝试访问 newpath 的进程都不会发现它丢失。
如果 oldpath 和 newpath 是指向同一文件的现有硬链接,那么 rename() 什么也不做,并返回一个成功状态。
如果 newpath 存在,但操作由于某种原因失败,rename() 保证会保留 newpath 的一个实例。
oldpath 可以指定一个目录。在这种情况下,newpath 必须不存在,或者它必须指定一个空目录。
但是,在覆盖时,很可能会有一个窗口,在这个窗口中,oldpath 和 newpath 都指向正在重命名的文件。
如果 oldpath 指向一个符号链接,则重命名该链接;如果 newpath 指向一个符号链接,则会覆盖该链接。
返回值
成功时返回零。出错时返回 -1,并相应地设置 errno。错误
- EACCES
- 拒绝对包含 oldpath 或 newpath 的目录的写入权限,或者拒绝对 oldpath 或 newpath 的路径前缀中的任何目录的搜索权限,或者 oldpath 是一个目录,并且不允许写入权限(需要更新 .. 条目)。(另请参见 path_resolution(7)。)
- EBUSY
- 重命名失败,因为 oldpath 或 newpath 是某个进程正在使用的目录(可能是当前工作目录,或根目录,或者因为它被打开用于读取),或者被系统使用(例如作为挂载点),而系统认为这是一个错误。(请注意,没有要求在这种情况下返回 EBUSY——这样做并没有错——但是如果系统无法处理这种情况,则允许返回 EBUSY。)
- EDQUOT
- 用户在文件系统上的磁盘块配额已用尽。
- EFAULT
- oldpath 或 newpath 指向您可访问地址空间之外的位置。
- EINVAL
- 新的路径名包含旧路径名的路径前缀,或者,更一般地说,尝试将一个目录变成其自身的子目录。
- EISDIR
- newpath 是一个现有的目录,但 oldpath 不是一个目录。
- ELOOP
- 在解析 oldpath 或 newpath 时遇到了太多的符号链接。
- EMLINK
- oldpath 已经具有最大数量的链接,或者它是一个目录,并且包含 newpath 的目录具有最大数量的链接。
- ENAMETOOLONG
- oldpath 或 newpath 太长。
- ENOENT
- 由 oldpath 命名的链接不存在;或者,newpath 中的一个目录组件不存在;或者,oldpath 或 newpath 是一个空字符串。
- ENOMEM
- 内核内存不足。
- ENOSPC
- 包含该文件的设备没有足够的空间来创建新的目录条目。
- ENOTDIR
- 用作 oldpath 或 newpath 中目录的组件不是一个实际的目录。或者,oldpath 是一个目录,并且 newpath 存在但不是一个目录。
- ENOTEMPTY 或 EEXIST
- newpath 是一个非空目录,也就是说,包含除“.”和“..”以外的其他条目。
- EPERM 或 EACCES
- 包含 oldpath 的目录设置了粘滞位 (S_ISVTX),并且进程的有效用户 ID 既不是要删除文件的用户 ID,也不是包含它的目录的用户 ID,并且进程没有特权(Linux:没有 CAP_FOWNER 功能);或者 newpath 是一个现有文件,并且包含它的目录设置了粘滞位,并且进程的有效用户 ID 既不是要替换文件的用户 ID,也不是包含它的目录的用户 ID,并且进程没有特权(Linux:没有 CAP_FOWNER 功能);或者包含 pathname 的文件系统不支持所请求类型的重命名。
- EROFS
- 文件位于只读文件系统上。
- EXDEV
- oldpath 和 newpath 不在同一个挂载的文件系统上。(Linux 允许将文件系统挂载在多个点上,但 rename() 不适用于不同的挂载点,即使相同的文件系统挂载在两者上。)