Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752670
  • 博文数量: 130
  • 博客积分: 2951
  • 博客等级: 少校
  • 技术积分: 1875
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-04 18:32
文章分类

全部博文(130)

文章存档

2013年(1)

2012年(129)

分类: C/C++

2012-10-23 17:53:59

mv 改名的功能内部调用 rename, 而rename 内部又调用了 link 和 unlink,
模拟片段:
  1. int link_based_rename(char *oldname, char *newname)
  2. {
  3.     if ( link(oldname, newname) != -1 )
  4.     {
  5.         if ( unlink(oldname) == -1 ){
  6.             unlink(newname);  //删除old不成功,那么还保留old, 删除掉新的。。可是删除新的也不成共咋办??
  7.             return -1;
  8.         }
  9.         return 0;
  10.     }
  11.     return -1;
  12. }
另外, rename不能跨文件系统操作,所以如果要用rename来重命名文件,需要如下代码:

  1. main()
  2. {
  3.     rv = rename(src,destfilename);
  4.     /*
  5.      * If target is different file system, try copy and remove
  6.      */
  7.     if ( rv == -1 && errno == EXDEV ) //in errno.h #define EXDEV  18 /* Cross-device link */
  8.         rv = copy_and_unlink(src,destfilename);
  1. }

  2. copy_and_unlink(char *old, char *new)
  3. {
  4.     FILE    *fpin, *fpout;
  5.     int    c;
  6.     int    rv = 0;

  7.     /** open files **/
  8.     if ( (fpin = fopen(old,"r")) == NULL )
  9.         return -1;
  10.     if ( (fpout = fopen(new, "w")) == NULL ){
  11.         fclose(fpin);
  12.         return -1;
  13.     }

  14.     /** do copy **/
  15.     while( rv == 0 && (c = getc(fpin)) != EOF )
  16.         if ( putc(c, fpout) == EOF )
  17.             rv = -1;

  18.     /** close files: if error, abandon project **/
  19.     if ( fclose(fpin) == EOF || fclose(fpout) == EOF ){
  20.         rv = -1;
  21.         unlink(new);
  22.     }
  23.     /** otherwise try to unlink original **/
  24.     else if ( unlink(old) == -1 ){
  25.         rv = -1;
  26.         unlink(new);
  27.     }

  28.     /** **/
  29.     return rv;
  30. }



阅读(2041) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~