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位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...
随机推荐
- stm32的定时器学习
看了几篇博客之后,对这个定时器也有了一些认识,其实和51差不多,就是配置定时器的时候多了几个步骤而已. 其中很好的一片是:http://blog.sina.com.cn/s/blog_49cb4249 ...
- FOJ 11月月赛题解
抽空在vjudge上做了这套题.剩下FZU 2208数论题不会. FZU 2205 这是个想法题,每次可以在上一次基础上加上边数/2的新边. #include <iostream> #in ...
- centos7 下nfs的配置
td p { margin-bottom: 0cm } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 补充知识: RPC 主程序: ...
- 记一次使用修改字节码的方法解决java.lang.NoSuchMethodError
接兔兔国际sdk ane 充值界面选择兔币充值就会闪退, 观察logcat 04-19 10:10:54.224: E/AndroidRuntime(20315): FATAL EXCEPTION: ...
- mui开发app之js将base64转图片文件
之前我已经做过一个利用cropper裁剪并且制作头像的功能.如何在mui app中实现相册或相机获取图片后裁剪做头像请看另一篇博客:mui开发app之cropper裁剪后上传头像的实现 但是当时裁剪后 ...
- 【算法系列学习】codeforces D. Mike and distribution 二维贪心
http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二 ...
- poj2785双向搜索
The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute ...
- OC 动态类型和静态类型
多态 允许不同的类定义相同的方法 动态类型 程序直到执行时才能确定所属的类 静态类型 将一个变量定义为特定类的对象时,使用的是静态形态 将一个变量定义为特定类的对象时,使用的是静态类型,在编译的时候就 ...
- C#之lambda表达式
从C#3.0开始,可以使用lambda表达式把实现代码赋予委托.lambda表达式与委托(http://www.cnblogs.com/afei-24/p/6762442.html)直接相关.当参数是 ...
- 关于Ubuntu的ssh免密登录
1.打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--> ...