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");
else
printf("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的更多相关文章
- windows中操作文件和目录的函数
1.文件操作函数 CreateFile();//创建或打开文件 ReadFile();//从文件读 WriteFile();//向文件写 SetFilePoi ...
- [APUE]文件和目录(中)
一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
- PHP 文件与目录操作函数总结
>>>文件操作 打开 fopen(); 打开文件 读取内容 fread(); 从文件指针 handle 读取最多 length 个字节 readfile(); 读入 ...
- APUE 文件和目录
文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...
- [APUE]文件和目录(下)
一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...
- php文件和目录操作函数
文件:打开和关闭:fopen(), fclose()读:readfile(), file(), file_get_contents(), fgets(), fgetss(), fgetc()写:fwr ...
- php 文件、目录操作函数
目录 opendir readdir closedir mkdir rmdir : 只能删除空目录 文件 filetype filesize is_file basename dirname pat ...
- APUE ☞ 文件和目录
粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...
随机推荐
- java OJ题目判断输入结束(与C语言的EOF结束等价)
/* * java 作Oj题目是会有输入若干数据的情况,不好判断输入结束符, * 类似于C语言中的EOF符号 * 在这里提供了一种方法 * */ import java.util.Iterator; ...
- 篇5 python自动化测试应用-Selenium环境篇
篇5 python自动化测试应用-Selenium环境篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),从本篇开始我将开始 ...
- 03(3) 基于GMM-HMM的SR基础
1.GMM-HMM的训练 1)训练GSM-HMM (1)确定HMM拓扑结构 (2)初始化HMM模型参数 (3)在所有的utterances中计算所需的统计量 (4)使用公式更新模型参数 (5)不收敛, ...
- 使用虚拟机CentOS7部署CEPH集群
第1章 CEPH部署 1.1 简单介绍 Ceph的部署模式下主要包含以下几个类型的节点 Ø CephOSDs: A Ceph OSD 进程主要用来存储数据,处理数据的replication,恢复 ...
- 基于ABP框架的权限设置
需求:在界面展示中,"定向包管理","竞价管理","竞拍管理","发布定向资源","添加竞价资源", ...
- OC中自定义构造方法
格式 -(instancetype)init(){ self=[super init] if(self){ } return self; } 自定义构造方法规范 1)一定是对象方法,以减号开头 2)返 ...
- ES6相关新特性介绍
你可能已经听说过 ECMAScript 6 (简称 ES6)了.ES6 是 Javascript 的下一个版本,它有很多很棒的新特性.这些特性复杂程度各不相同,但对于简单的脚本和复杂的应用都很有用.在 ...
- zabbix监控docker
[toc] 1.下载模版 然后把模版放到/usr/local/lib/zabbix/agent下 github地址内含监控模版 2.修改 zabbix-agentd 配置文件 vim /usr/loc ...
- Linux文件属性及如何修改文件属性
ls -al:显示文件的文件名与相关属性并列出所有文件详细的权限与属性 dr-xr-x---. 7 root root 4096 Apr3 12:31 ...
- Hibernate 核心接口和工作机制
主要内容 Configuration类 sessionFactory接口 session接口 Transaction接口 Query 和 criteria接口 1.Configuration类 负责管 ...