Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18024
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 58
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-29 18:43
文章分类
文章存档

2014年(5)

我的朋友

分类: C/C++

2014-04-19 13:54:37


点击(此处)折叠或打开

  1. /*cp命令简单实现
  2.  *cp src dest
  3.  *支持 -i选项 cp -i src dest
  4.  *-i 询问是否覆盖,当src dest相同时
  5.  */
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<fcntl.h>
  10. #include<unistd.h>

  11. #define    BUFFSIZE    4096
  12. #define    COPYMODE    0644           

  13. void usage(void);
  14. int file_exits(char *filename);        //文件存在返回1,失败返回0
  15. int file_replace(char *filename);    

  16. int main(int argc,char *argv[])
  17. {
  18.     char *src = NULL,*dest = NULL;
  19.     char buff[BUFFSIZE];
  20.     int i_option = 0;    
  21.     int in_fd,out_fd;
  22.     int n_chars;

  23.     while(--argc)        //处理参数
  24.     {
  25.         if( strcmp("-i",*++argv) == 0 )
  26.             i_option = 1;
  27.         else if( !src )
  28.             src = *argv;
  29.         else if( !dest )
  30.             dest = *argv;
  31.         else
  32.             usage();        //打印使用方法并退出
  33.     }
  34.     if( !src || !dest )
  35.         usage();
  36.         
  37.     if( (in_fd = open(src,O_RDONLY)) == -1 )    //打开源文件
  38.     {
  39.         perror("open src file failed");
  40.         exit(1);
  41.     }
  42.     
  43.     if( !i_option || !file_exits(dest) || file_replace(dest) )        //目标文件
  44.     {    //创建一个文件并以只写的方式打开,如果原来该文件存在,会将这个文件的长度截短为0
  45.         if( (out_fd = creat(dest,COPYMODE)) == -1 )
  46.         {
  47.             perror("creat dest failed");
  48.             exit(1);
  49.         }
  50.     }
  51.     
  52.     while( (n_chars = read(in_fd,buff,BUFFSIZE)) > 0 )
  53.     {
  54.         if( write(out_fd,buff,n_chars) != n_chars )
  55.         {
  56.             perror("write to dest file failed");
  57.             exit(1);
  58.         }
  59.     }
  60.     if( n_chars < 0 )
  61.     {
  62.         perror("read from src file failed");
  63.         exit(1);
  64.     }
  65.     
  66.     close(in_fd);
  67.     close(out_fd);
  68.     
  69.     return 0;
  70. }

  71. int file_exits(char *filename)        //文件存在返回1,失败返回0
  72. {
  73.     int fd;
  74.     fd = open(filename,O_RDONLY);
  75.     if(fd == -1)
  76.         return 0;
  77.     else
  78.     {
  79.         if( close(fd) == -1 )
  80.         {
  81.             perror("close file failed");
  82.             exit(1);
  83.         }
  84.         return 1;
  85.     }
  86. }

  87. int file_replace(char *filename)
  88. {
  89.     char ans[10];
  90.     int retval = 0;
  91.     int ch;
  92.     
  93.     fprintf(stderr,"replace the %s ?",filename);
  94.     if( scanf("%9s",ans) == 1 )
  95.     {
  96.         if( ans[0] == 'Y' || ans[0] == 'y' )
  97.             retval = 1;
  98.     }
  99.     while( (ch=getchar()) != EOF && ch != '\n' )
  100.         continue;        
  101.     return retval;
  102. }

  103. void usage(void)
  104. {
  105.     printf("usage:cp [-i] src dest\n");
  106.     exit(1);
  107. }

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