APUE-文件和目录(五)函数rename和renameat

2024-04-07 12:48

本文主要是介绍APUE-文件和目录(五)函数rename和renameat,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

rename和renameat

#include <stdio.h>
int rename(const char *oldname,const char*newname);
int renameat(int oldfd,const char *oldname,int newfd, const char *newname);成功返回0;失败返回-1

看下面一段代码,让我们对rename做一下测试:

#include <stdio.h>int main(int args,char *argv[])
{if(args!=3)printf("The parameter number is not correct!");int rv = rename(argv[1],argv[2]);if(rv<0)err_sys("rename error");elseprintf("rename success!\n")
}
oldname是一个文件
  • oldname 是一个文件,newname不能是已经存在的一个目录。
[harlan@pes1 myexamples]$ touch 1.txt
[harlan@pes1 myexamples]$ mkdir dir
[harlan@pes1 myexamples]$ ./a.out 1.txt dir
rename error: Is a directory

可以看到,重命名失败。

  • oldname是一个文件,newname存在,并且是一个文件,rename执行成功。看下面的例子,1.txt大小为0byte,2.txt为27bytes。
[harlan@pes1 myexamples]$ ll *.txt
-rw-rw-r-- 1 harlan harlan  0 Jun 10 19:34 1.txt
-rw-rw-r-- 1 harlan harlan 27 Jun 10 19:41 2.txt

执行rename之后,2.txt被删除,1.txt被重命名成2.txt。

[harlan@pes1 myexamples]$ ./a.out 1.txt 2.txt
rename success!
[harlan@pes1 myexamples]$ ll *.txt
-rw-rw-r-- 1 harlan harlan 0 Jun 10 19:34 2.txt
  • 调用进程需要对包含oldname和newname的目录具有写权限,否则执行失败。
[pesuser@pes1 myexamples]$ ll a.out
-rwxrwxr-x 1 harlan harlan 16214 Jun 10 19:39 a.out

其他用户对a.out没有写权限,因此,切换到pesuser用户执行:

[harlan@pes1 myexamples]$ su pesuser
Password:
[pesuser@pes1 myexamples]$ ll *.txt
total 40
-rw-rw-r-- 1 harlan harlan     0 Jun 10 19:34 2.txt
[pesuser@pes1 myexamples]$ ./a.out 2.txt 3.txt
rename error: Permission denied

执行失败,没有权限。

oldname是一个目录
  • 如果newname存在,则它必须引用一个目录,而且该目录应当是空目录。这时候会先将newname删除,然后将oldname重命名为newname。
[harlan@pes1 myexamples]$ ls -l | grep dir
drwxrwxr-x 2 harlan harlan  4096 Jun 10 19:36 dir
drwxrwxr-x 2 harlan harlan  4096 Jun 10 19:59 dir2
[harlan@pes1 myexamples]$ ./a.out dir dir2
rename success!
[harlan@pes1 myexamples]$ ls -l | grep dir
drwxrwxr-x 2 harlan harlan  4096 Jun 10 19:36 dir2
  • 不能在newname中包含oldname作为其路径前缀。
[harlan@pes1 myexamples]$ ./a.out "/github/APUE/chapter_4/myexamples/dir3" "/github/APUE/chapter_4/myexamples/dir3/test"
rename error: Invalid argument
oldname或者newname是符号链接
  • 这时候rename修改的是符号链接本身,而不是它所引用的文件。
[harlan@pes1 myexamples]$ ln -s 2.txt 3.txt
[harlan@pes1 myexamples]$ ll *.txt
-rw-rw-r-- 1 harlan harlan 0 Jun 10 19:34 2.txt
lrwxrwxrwx 1 harlan harlan 5 Jun 10 20:08 3.txt -> 2.txt
[harlan@pes1 myexamples]$ ./a.out  3.txt 4.txt
rename success!
[harlan@pes1 myexamples]$ ll *.txt
-rw-rw-r-- 1 harlan harlan 0 Jun 10 19:34 2.txt
lrwxrwxrwx 1 harlan harlan 5 Jun 10 20:08 4.txt -> 2.txt
特殊情况
  • 不能对.和..重命名。更确切的说,.和..不能出现在oldname和newname的最后部分。
  • 如果oldname和newname引用同一个文件,则函数不做任何更改而成功返回。
注意:

如果newname已经存在,则调用进程对它需要有写权限(如同删除情况一样)。另外,调用进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含oldname和包含newname的目录具有写和执行权限。

这篇关于APUE-文件和目录(五)函数rename和renameat的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882639

相关文章

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资