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!
")}oldname是一个文件
- oldname 是一个文件,newname不能是已经存在的一个目录。
[harlan@pes1 myexamples]$ touch 1.txt[harlan@pes1 myexamples]$ mkdir dir[harlan@pes1 myexamples]$ ./a.out 1.txt dirrename 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.txtrename 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 pesuserPassword:[pesuser@pes1 myexamples]$ ll *.txttotal 40-rw-rw-r-- 1 harlan harlan 0 Jun 10 19:34 2.txt[pesuser@pes1 myexamples]$ ./a.out 2.txt 3.txtrename error: Permission denied执行失败,没有权限。
oldname是一个目录
- 如果newname存在,则它必须引用一个目录,而且该目录应当是空目录。这时候会先将newname删除,然后将oldname重命名为newname。
[harlan@pes1 myexamples]$ ls -l | grep dirdrwxrwxr-x 2 harlan harlan 4096 Jun 10 19:36 dirdrwxrwxr-x 2 harlan harlan 4096 Jun 10 19:59 dir2[harlan@pes1 myexamples]$ ./a.out dir dir2rename success![harlan@pes1 myexamples]$ ls -l | grep dirdrwxrwxr-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 argumentoldname或者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.txtlrwxrwxrwx 1 harlan harlan 5 Jun 10 20:08 3.txt -> 2.txt[harlan@pes1 myexamples]$ ./a.out 3.txt 4.txtrename success![harlan@pes1 myexamples]$ ll *.txt-rw-rw-r-- 1 harlan harlan 0 Jun 10 19:34 2.txtlrwxrwxrwx 1 harlan harlan 5 Jun 10 20:08 4.txt -> 2.txt特殊情况
- 不能对.和..重命名。更确切的说,.和..不能出现在oldname和newname的最后部分。
- 如果oldname和newname引用同一个文件,则函数不做任何更改而成功返回。
注意:
如果newname已经存在,则调用进程对它需要有写权限(如同删除情况一样)。另外,调用进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含oldname和包含newname的目录具有写和执行权限。
作者:HarlanC
博客地址:http://www.cnblogs.com/harlanc/
个人博客: http://www.harlancn.me/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接
如果觉的博主写的可以,收到您的赞会是很大的动力,如果您觉的不好,您可以投反对票,但麻烦您留言写下问题在哪里,这样才能共同进步。谢谢!
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。


